我有這個功能,編譯器對我說:「不能將字符串轉換爲常量字符」。無法將字符串轉換爲常量字符
void
DramaticLetters(string s, short TimeLength)
{
for(int i = 0, sLen = strlen(s); i < sLen; i++){
cout << s[i];
Sleep(TimeLength);
}
}
有一些錯誤的strlen的,我覺得
我有這個功能,編譯器對我說:「不能將字符串轉換爲常量字符」。無法將字符串轉換爲常量字符
void
DramaticLetters(string s, short TimeLength)
{
for(int i = 0, sLen = strlen(s); i < sLen; i++){
cout << s[i];
Sleep(TimeLength);
}
}
有一些錯誤的strlen的,我覺得
strlen()
是對C const char*
字符串。要獲得字符串的長度s
,請使用s.size()
或s.length()
。如果您想從string
獲取C字符串,請使用s.c_str()
。
雖然C++使得似乎是const char*
和string
是可以互換的,在轉換到const char*
時string
唯一無二的一種方式。
你沒有理由爲什麼要使用strlen
。 strlen
很可能是用一個循環定義的,這個循環永遠不會像size()
那樣有效,它最類似於string
類的長度屬性的獲取器。在調用沒有C++替代品的C函數時,只能將string
轉換爲C字符串。
您不應該混用C和C++字符串函數。取而代之的strlen()
(C風格的功能),使用string::size()
:
for(int i = 0, sLen = s.size(); i < sLen; i++) {
cout << s[i];
Sleep(TimeLength);
}
這裏有來自string
類的所有方法reference。
那麼不是所有的C函數都可以在C++中使用嗎? – user1575615 2012-08-16 01:34:14
@ 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
正如克里斯在他的評論中所說,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);
}
strlen
上char const *
工作。如果你真的想,你可以做strlen(s.c_str())
,但std::string
有很多的功能,包括length()
方法,它返回的字符數的字符串中
幾句話:
你不修改函數中的字符串,以便更好地傳遞一個常量引用(const string & s)
該字符串本身定義了獲取其長度的方法 - s.size()和s.length()都可以工作。另外一個好處是這兩種方法都不變就持此看法的strlen的
線性複雜。如果你真的想使用strlen使用s.c_str()的複雜性:strlen(s.c_str())
只需使用單曲.length()'或's.size()'。字符串不會隱式轉換爲字符數組。如果你真的需要一個(你不需要長度),使用's.c_str()'。 – chris 2012-08-15 14:09:00
http://stackoverflow.com/questions/347949/convert-stdstring-to-const-char-or-char?rq = 1 – mkb 2012-08-15 14:10:57
只是一個普遍的提示 - 如果標準功能出現問題,99.99%的時間是你的錯。 – Cubic 2012-08-15 14:12:27