2013-08-18 53 views
0

我實現了一個用戶名數據庫中的字符串匹配算法。我的方法需要一個現有的用戶名數據庫和一個用戶想要的新用戶名,並檢查用戶名是否被使用。如果採取的方法應該返回用戶名與數據庫中沒有采取的數字。C++實現字符串匹配的ALG

實施例:

「賈斯汀」, 「Justin1」, 「Justin2」, 「Justin3」

輸入 「賈斯汀」

返回: 「Justin4」,因爲賈斯汀和Justin用數字1通過3已經被採取。

我已經用Java編寫的代碼,現在我寫它在C++中的實踐。我有一些問題,但:

  1. 你如何比較兩個字符串?我已經嘗試過strcmp和其他幾個,但我總是得到錯誤信息:無法將std :: string轉換爲const char *作爲參數2.

  2. 如何連接一個int和一個字符串?在java中它就像使用+運算符一樣簡單。

  3. 在我的主要功能,它說沒有匹配的函數調用用戶名:NewMember(的std :: string,的std :: string)。爲什麼它不認識mainMember?

    #include<iostream> 
        #include<string> 
        using namespace std; 
    
        class Username { 
        public: 
    
    
    
    string newMember(string existingNames, string newName){ 
    
    bool found = false; 
    bool match = false; 
    string otherName = NULL; 
    
    for(int i = 0; i < sizeof(existingNames);i++){ 
        if(strcmp(existingNames[i], newName) == 0){ 
         found = true; 
         break; 
        } 
    
    } 
    if(found){ 
        for(int x = 1; ; x++){ 
         match = false; 
         for(int i = 0; i < sizeof(existingNames);i++){ 
          if(strcmp(existingNames[i],(newName + x)) == 0){ 
           match = true; 
            break; 
          } 
    
         } 
         if(!match){ 
          otherName = newName + x; 
          break; 
         } 
    
        } 
    
        return otherName; 
    
    } 
    
    
    
    
    
    else return newName; 
    
    
    
    
    } 
    
    int main(){ 
    
    
    string *userNames = new string[4]; 
    userNames[0] = "Justin"; 
    userNames[1] = "Justin1"; 
    userNames[2] = "Justin2"; 
    userNames[3] = "Justin3"; 
    
    cout << newMember(userNames, "Justin") << endl; 
    
    delete[] userNames; 
    
    return 0; 
    
    
        } 
    } 
    
+0

閱讀'sizeof'做什麼。並且沒有理由在'main'中使用指針。 – chris

+0

當你在這裏,閱讀['std :: string'](http://en.cppreference.com/w/cpp/string/basic_string)可以爲你做* *(回答你的「如何比較字符串「問題),並且當你不需要修改內容或製作臨時副本時,通過學習const引用參數的樂趣讓你的運行時內存管理器休息一下。 – WhozCraig

+0

在java-translated-to-C++中有足夠的錯誤,你需要明白它們到底有多不同。 [看到它住在這裏](http://ideone.com/sqZyiA)。 – WhozCraig

回答

1

好吧,有在你的代碼中的錯誤:

  • 如果要比較兩個string S,只需使用operator==string == string2

  • 如果你想到int追加到在C++ string你可以使用streams

    #include <sstream> 
    
    std::ostringstream oss; 
    oss << "Justin" << 4; 
    std::cout << oss.str(); 
    
  • 你傳遞一個string*的功能newMember但你原型不匹配:

    string *userNames = new string[4]; 
    newMember(userNames, "Justin"); // Call 
    
    string newMember(string existingNames, string newName); // Protype 
    

    我想應該是:string newMember(string* existingNames, string newName);沒有?

  • 在此示例中,您的main函數在您的類Username中。它在C/C++中不正確。與Java不同,main函數在全局範圍內。

  • 最後,你應該使用const-reference parameter因爲你並不需要對它們進行修改的內容,你需要複製他們要麼:

    string newMember(string* existingNames, const string& newName); 
    //          ^^^^^  ^
    

你確定你需要的東西的動態分配主功能 ?

+0

我收到錯誤:未定義的符號: 「_main」,從引用: 開始在crt1.10.6.o LD:符號(S)沒有發現 collect2:LD返回1退出狀態 但我有我的主要功能在我的程序中。爲什麼它沒有檢測到我的主要功能? – user2510809

+0

@ user2510809在你給我們的例子中,似乎你的'main'函數在'Username'類裏面,但不像'java','main'函數必須在全局範圍內。 –

+0

@ user2510809我更新了我的答案,將其添加到解釋中。它現在工作嗎? –