2012-08-15 64 views
3

我有這個功能,編譯器對我說:「不能將字符串轉換爲常量字符」。無法將字符串轉換爲常量字符

void 
DramaticLetters(string s, short TimeLength) 
{ 
    for(int i = 0, sLen = strlen(s); i < sLen; i++){ 
     cout << s[i]; 
     Sleep(TimeLength); 
    } 
} 

有一些錯誤的strlen的,我覺得

+5

只需使用單曲.length()'或's.size()'。字符串不會隱式轉換爲字符數組。如果你真的需要一個(你不需要長度),使用's.c_str()'。 – chris 2012-08-15 14:09:00

+0

http://stackoverflow.com/questions/347949/convert-stdstring-to-const-char-or-char?rq = 1 – mkb 2012-08-15 14:10:57

+1

只是一個普遍的提示 - 如果標準功能出現問題,99.99%的時間是你的錯。 – Cubic 2012-08-15 14:12:27

回答

4

strlen()是對C const char*字符串。要獲得字符串的長度s,請使用s.size()s.length()。如果您想從string獲取C字符串,請使用s.c_str()

雖然C++使得似乎const char*string是可以互換的,在轉換到const char*string唯一無二的一種方式。

你沒有理由爲什麼要使用strlenstrlen很可能是用一個循環定義的,這個循環永遠不會像size()那樣有效,它最類似於string類的長度屬性的獲取器。在調用沒有C++替代品的C函數時,只能將string轉換爲C字符串。

1

您不應該混用C和C++字符串函數。取而代之的strlen()(C風格的功能),使用string::size()

for(int i = 0, sLen = s.size(); i < sLen; i++) { 
    cout << s[i]; 
    Sleep(TimeLength); 
} 

這裏有來自string類的所有方法reference

+0

那麼不是所有的C函數都可以在C++中使用嗎? – user1575615 2012-08-16 01:34:14

+0

@ user1575615 C++「重新實現」了許多C特性(例如,使用class std :: string而不是char數組和strlen,strcpy等)。不過,您仍然可以使用C風格的功能。實際上,你可以創建一個類似於C的C++程序,但是你不應該把C++和C++解決方案混合在一起,例如'std :: string'(來自C++)和'strlen','strcmp'等等(來自C )。 – betabandido 2012-08-16 08:06:33

1

正如克里斯在他的評論中所說,strlen用於const char *,而你通過它string。取而代之的

for(int i = 0, sLen = strlen(s); i < sLen; i++){ 
    cout << s[i]; 
    Sleep(TimeLength); 
} 

使用此:

for(int i = 0, sLen = s.length(); i < sLen; i++){ 
    cout << s[i]; 
    Sleep(TimeLength); 
} 
0

strlenchar const *工作。如果你真的想,你可以做strlen(s.c_str()),但std::string有很多的功能,包括length()方法,它返回的字符數的字符串中

0

幾句話:

  • 你不修改函數中的字符串,以便更好地傳遞一個常量引用(const string & s)

  • 該字符串本身定義了獲取其長度的方法 - s.size()和s.length()都可以工作。另外一個好處是這兩種方法都不變就持此看法的strlen的

  • 線性複雜。如果你真的想使用strlen使用s.c_str()的複雜性:strlen(s.c_str())