2015-08-15 110 views
0

內存分配錯誤我有這個簡單的代碼,並不能弄清楚如何爲scanf函數與scanf函數

char* string= (char*) malloc (sizeof(char)); 
printf("insert string: \n"); 
scanf("%s", string); 
free(string); 

不要緊,我的字符串有多少個字符是分配內存,這是一個錯誤。我想使用malloc作爲char *,以任何方式爲scanf設置內存。

+3

你只給字符串分配1個字節。足夠的字符串終結符'\ 0'爲空字符串,但沒有別的。 –

+0

你是什麼意思「這是一個錯誤」? *什麼*錯誤?你如何分配多個角色?順便說一句,'sizeof(char)'被指定爲總是導致「1」。 –

回答

1

你只是要求1個字節。你需要比,如果你想存儲的不僅僅是字符串中的0終止更多分配更多:

char* string= malloc (256); //256 bytes, arbitrary value... 

我刪除:

  • sizeof(char),因爲它總是保證是1
  • (char*)因爲鑄造返回值爲malloc() is needless

我也推薦使用fgets()而不是scanf()來防止溢出緩衝區。通過在格式字符串中指定長度,可以通過scanf()完成相同的操作。但我個人更喜歡使用fgets(),如果有必要,使用sscanf()解析。

+0

也應該使用'%255s'作爲格式字符串 –

0

嘗試

char buf[256]; 
    scanf("%s" , buf); 

刪除您的malloc。 你正在分配一小段內存給可能是一個可變大小的字符串數組。默認情況下,一個數組只是一個指向buf [0]的指針,這是字符串會給它的。您需要一個緩衝區來捕獲最初的讀取,然後分配適當的內存。

之後,你可以做字符串長度=(BUF)*的sizeof(char)的< - 僞

指定字符串的正確長度。

0

As @Blue Moon正確地指出,你只是分配內存來存儲一個字符,並且單個字符可以存儲的唯一字符串是空字符串或沒有字符的字符串。在C中,所有字符串都是空終止的,並且您分配的內存的1個字節只能容納空字符,即'\ 0'

爲了在字符串中存儲更多的字符,比如說一百個字符,可以做到以下幾點:

#define MAX_STRING_SIZE 102 

char* string= (char*) malloc (sizeof(char) * MAX_STRING_SIZE); 
memset(string, '\0', MAX_STRING_SIZE); 
printf("Insert string: \n"); 
scanf("%101s", string); 
if (strlen(string) == (MAX_STRING_SIZE - 1)) 
{ 
    printf("The user entered a string larger than 100 characters!"); 
    free(string); 
    /****Error handling***/ 
} 

/*****Do something with string****/ 
free(string) 

上面的代碼是一個不錯的小把戲,以找出是否用戶輸入的字符或不是一個有效的數字。如果您希望用戶輸入最多100個字符,並且您的程序始終在理想情況下運行(用戶一直監聽並且永遠不會輸入超過100個字符),您只需要一個額外的字節來存儲空值字符。因此,你需要101個字符的空間。但是,您可以爲其他字符添加空間,並分配102個字節,以查找用戶輸入超過100個字符的字符串時的情況。

工作原理:假設用戶輸入100多個字符。 scanf函數最多可以讀取101個字符。因此,我們可以使用strlen函數來檢查用戶輸入的字符數是否等於101,這將有助於我們驗證輸入字符串。

+0

您的意思是'%101s'。此外,如果EOF發生,檢查scanf返回值或初始化字符串將會很好 –

+0

@Matt McNabb:%101s寬度說明符將限制可以讀取的字符數爲101.我已經使用另一個空間保留空字符(第102位),以便strlen可以在保存的字符串上成功運行(因爲strlen搜索空字符)。我已經添加了memset以將所有字符值設置爲'\ 0'以使答案更完整:) –

+0

在我給了片段另外一個外觀之後,我意識到calloc可以用來在一個步驟中完成malloc + memset。它會使它看起來更整潔;) –