2015-08-16 46 views
-1

我知道字符串文字存儲在只讀存儲器中,因此您無法更新它們。但是strlen()函數有什麼問題,如果我在程序中初始化char * s,它會起作用。即當從用戶處獲取字符串並使用strlen()查找其長度時,分段錯誤(核心轉儲)

char *s="hey"; 
length=strlen(s); 
printf("%d\n",length);// this works 

,並從用戶

char *s; 
int length; 
scanf("%s",s); 
length=strlen(s); 
printf("%d\n",length); //this doesn't. gives segmentation fault 
+1

'的scanf( 「%S」,S);'調用未定義行爲,這意味着任何事情都有可能發生。 –

回答

5

你必須分配內存,你要讀一個字符串,字符串,服用時不一樣。對於exampe

char s[20] = { '\0' }; 
int length; 
scanf("%19s",s); 
length=strlen(s); 
printf("%d\n",length); 

如果申報人就像這樣

char *s; 

然後將鼠標指針未初始化。

如果申報人就像這樣

char *s="hey"; 

然後scanf函數會嘗試改變字符串字面量的結果在程序的未定義行爲。

+0

感謝回覆:) 如果我有幾個測試用例.one用戶輸入1000+字符和其他與5個字符。如果我使用字符數組,它浪費了很多space.any選擇(只在c)? – Satyanarayin

+0

@Satyanarayin使用'malloc'和'realloc'的動態內存分配就是你要找的。 –

-2

strlen搜索null以確定長度。如果字符串不是空的,那麼它會給變量的大小賦予長度。在這種情況下,你沒有分配內存,也沒有空終止。

我希望你有你在找什麼

+0

感謝您的回覆:)如果我有幾個測試用例.one用戶輸入1000+字符和其他5字符。如果我使用字符數組,它浪費了很多space.any選擇(只在c)? – Satyanarayin

+0

@Gaurav:不正確,如果你不'終止''strlen'的行爲是不確定的。 –

+0

@Satyanarayin:在C++中還有其他語言特定的選項,但在C中,您可能會考慮編寫一個逐字輸入字符並構建數組的函數。使用你自己的函數,你可以跟蹤長度,如果需要的話,可以使用'realloc'調整'malloc'分配的數組的大小。有一些'scanf'的非可移植擴展允許它分配它需要的內存,但只有當你使用gcc作爲編譯器時(我不推薦非標準功能) –