2012-04-02 260 views
3

我有問題將下一個代碼從c轉換爲C++:
我有一個函數將移動序列(從a到i的字符序列)作爲arg。指針字符數組C++

代碼:

void mkmove(char** move) { 
    int i = 0; 
    char* p = NULL; 
    int moves[9][9]; 

    for(int i = 0; i < 9; i++) { 
     for(p = move[i]; *p; p++) { 
      moves[i][*p - 'a'] = 3; 
     } 
    } 
} 

int main() { 
    char* movestr[] = {"abde", "abc", "bcef", "adg", "bdefh", "cfi", "degh", "ghi", "efhi"}; 
    mkmove(movestr); 

    return(0); 
} 

GCC編譯的代碼罰款,但如果我嘗試使用g編譯它++它給​​了我下一個警告:
的main.cpp:17:39:警告:從字符串轉換棄用常量到'char *'[-Wwrite-strings]

我相信這個警告來自事實,即C中的字符串被定義爲char [],而C++使用std :: string。在主要功能

std::string* movestr = {'abde', "abc", "bcef", "adg", "bdefh", "cfi", "degh", "ghi", "efhi"}; 

,並添加C++字符串頭文件:
所以,我試圖替換使用C++字符串這樣的代碼:

void mkmove(std::string* move) { 
在mkmove功能defenition

,並

#include <string> 

但現在我收到錯誤:
main.cpp:函數'void mkmove(std :: string *)':
main.cpp:11:21:錯誤:無法將'std :: string {aka std :: basic_string}'轉換爲'char *'賦值
main.cpp:函數'int main()':
main.cpp:19:39:error:標量對象'movestr'需要初始化程序中的一個元素

我也嘗試了一些其他的調整,但是這給了我至少編譯錯誤。

那麼將頂級代碼從C轉換爲C++的正確方法是什麼?

感謝您的回答!

-Slovenia1337

回答

5

使用

std::string movestr[] = {"abde", "abc", "bcef", "adg", "bdefh", "cfi", "degh", "ghi", "efhi"}; 
+0

或者(U唱C++ 11)'std :: vector movestr = {「abde」,「abc」,...};' – bames53 2012-04-02 17:19:52

5

號,警告是不是因爲你應該使用string,這是因爲字符串是隻讀的。

聲明字符串爲char ...[]const char *

在你的情況,你聲明的char *陣列,這是一個棄用的功能(從const char *轉換爲char *

+0

+1解釋錯誤的真正含義,但最好從'char *'切換到'std :: string'而不是'char const *' – bames53 2012-04-02 17:15:36

+0

絕對。但是,如果他將C代碼轉換爲C++,那麼將所有內容切換到「字符串」將會更難,這將使他的生活變得更加輕鬆。 – 2012-04-02 17:16:37

+0

我猜哪種方式最好取決於需要轉換多少。如果上面的代碼實際上是我將切換到C++類型的整個程序。 (當然,它顯然不是一個完整的程序,或者如果它沒有做任何事情) – bames53 2012-04-02 17:32:35

0

I believe this warning comes from the fact that string in C is defined as char[] , while c++ uses std::string .

不,C字符串文字是常量char[],而在C++中,他們是const char[]

修復程序的常量,因此正確性:

void mkmove(const char** move) { 
    const char* p; 
    int moves[9][9]; 

    for(int i = 0; i < 9; i++) { 
     for(p = move[i]; *p; p++) { 
      moves[i][*p - 'a'] = 3; 
     } 
    } 
} 

int main() { 
    const char* movestr[] = {"abde", "abc", "bcef", "adg", "bdefh", "cfi", "degh", "ghi", "efhi"}; 
    mkmove(movestr); 

    return(0); 
}