2015-09-09 41 views
-3

我已將C++轉換爲c類型的字符串並使用strlen,但它不起作用。Strlen for C++中的字符串

#include<bits/stdc++.h> 
using namespace std; 
int main(){ 
string s("Hello"); 
s.c_str(); 
cout<<strlen(s); 
} 
+0

調用's.c_str()'不會將'std :: string'轉換爲「c類型字符串」。它返回一個指向保存在'std :: string'中的字符串,你忽略它。所以這個聲明本質上是一個沒有操作的聲明。嘗試:'std :: cout << strlen(s.c_str())'或者更好的是'std :: cout << s.size()' –

+2

這行's.c_str();'什麼也不做。 – crashmstr

+1

這是.....不工作?這是一個非常模糊的錯誤報告。它應該做什麼?它究竟在做什麼? –

回答

5
s.c_str(); 

該代碼對s沒有副作用實際上關於轉換或這樣。您想要進一步處理結果。

而不是

cout<<strlen(s); 

你想要麼

cout<<strlen(s.c_str()); 

cout<<s.size(); 

其中後者的肯定更有效,因爲標準重新對於std::string::size()需要O(1)的時間複雜度,其中strlen()不能保證比O(strlen(s))更好的時間複雜度。

+0

我會說清楚調用'string :: size()'是一個O(1)操作,而不是'strlen'的O(n)操作。 – Mgetz

+0

@Mgetz尼斯額外的信息感覺自由編輯;-) ... –

+0

我很懶我剛剛upvoted席茨回答 – Mgetz

4

如果你不想浪費時鐘週期在您的處理器:

cout << strlen(s.c_str()); 

會請計算s中的第一個nul字符的每個字符。

如果你只是想知道字符串有多長:

cout << s.length(); 

cout << s.size(); 

會給你(以及一種算法,是O(1)而不是strlen算法,該算法O(n) - 意思是一百萬個字符長的字符串需要比單個字符串長一百萬倍才能測量長度)。 [當然,如果你有一個std::string的中間包含一個空字符,你可能會發現其中一個方法是「正確的」,另一個是「錯誤的」,因爲它會給出太長或太短的長度 - a C風格字符串不允許在字符串中間包含空字符,它只允許作爲終止]