2014-12-04 71 views
-1

我是一個初學者,並且我遇到了scanf和字符串的問題。C中的scanf和字符串的分段錯誤

這裏是我寫我的問題的一個例子。

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    char* string; 
    scanf("%s", &string); 
    if (strcmp(string, "Foo") == 0) //segmentation fault here 
     printf("Bar"); 
} 

基本上,這個代碼編譯,但是當我運行它,我的strcmp()得到一個分段錯誤

,如果我替換爲「&串」它的工作原理該行的「弦」,但我從編譯器得到這個錯誤

/usr/include/stdio.h:362:12: note: expected 'const char * __restrict__' but argument is of type 'char **' 

這讓我覺得這個解決方案不是很理想。

另外,如果我聲明的字符串是這樣的:

char string[100]; 

,沒有任何警告的作品,但這也並不理想,因爲我不知道該字符串多大將是。

有沒有更好的解決方案我在這裏失蹤,還是這些是我唯一的選擇?

謝謝。

+1

讀一本書 - C是不是一個語言,通過試驗和錯誤學習。 (在許多情況下,如果出現錯誤,程序將默默工作,或給出令人困惑的結果;結果導致錯誤的心理模型以及對數組和指針之間差異的永久理解等) – 2014-12-05 01:49:30

+0

你需要聲明足夠大的字符串(正如你猜測的那樣),但是有多大?閱讀關於malloc。如果你將字符串聲明爲char string [1];你可能有一個有效的程序,但有時卻失敗了,因爲你存儲sscanf()'ed字符串的位置太小... – ChuckCottrill 2014-12-05 02:33:47

回答

1
char* string; 
scanf("%s", &string); 

string未指向任何有效的內存位置。使用malloc將內存分配給一組字符並將輸入複製到該字符。確保分配的內存有空間終止字符。請記住free內存以避免泄漏。

+0

或者只是在堆棧上創建一個'char'數組,避免使用'malloc '。 – StilesCrisis 2014-12-05 00:18:46

+0

好的,那是有效的。有沒有一種方法可以根據用戶輸入的字符串的大小分配內存?這樣我就不必猜測字符串有多大也是 – bbm21 2014-12-05 01:16:53

+0

也不要用'&' – 2014-12-05 01:48:26

1

試試看代碼

 #include <stdio.h> 
    #include <string.h> 
    #include <stdlib.h> 
    int main(void) 
    { 
     char* string; 
     string=(char *)malloc(3); /*allocate the memory to string cahr pointer(default pointer point to single byte and if you print pointer variable don't used & character)*/              
     scanf("%s", string); 
     if (strcmp(string, "Foo") == 0) 
      printf("Bar\n"); 
    } 
+0

3對於一個'malloc'編輯的字符串緩衝區來說不是一個合理的大小。它至少應該是4。 – 2014-12-05 06:17:56

0

雖然宣佈一個char *。它不會有任何內存位置。所以您必須在使用該變量之前分配一個 內存位置。 char * p; p = malloc(sieof(char)* string的大小);

然後你使用scanf()函數。它會正常工作。

當我們正在訪問一個未知的內存(即未分配的內存)。那麼它將通過分段錯誤