2014-02-12 30 views
2

當然假設沒有輸入將大於9個字符。例如:字符數組可以被C中更長的字符串覆蓋嗎?

#define MAX 10 
char array[MAX]; 
while(scanf("%s",array))!=NULL){ 
    //do something with the array one time, 
    //now when I go back to the top of the loop I want to store a new string in the array 
    //that may be longer or shorter 
    //than the string that was previously in there. Ideally I want to overwrite the array 
    //since I don't need the data anymore. 
} 

我會遇到問題嗎?有一個更好的方法嗎?也許使用一個指針和malloc?提前致謝。記住,我是初學者,想要學習正確的方法。

+2

您可以根據需要覆蓋前一個字符串,但'array'永遠不能容納超過10個'char's。你真的想用它做什麼? (另外:如果你想真的正確使用'scanf(「%9s」,array)'或['fgets'](http://en.cppreference.com/w/c/io/fgets),那麼即使輸入超過9個'char',輸入也不會溢出。) – Kninnug

+0

「當然假定沒有輸入會大於9個字符」 - 您無法合理地假設這一點。 –

+0

對於這個特定的情況,我假設。 –

回答

2

是的,你會遇到這樣做的問題。

#define MAX 10 
char array[MAX]; 
while(scanf("%s", array)) != 1) { 
    /* ... */ 
} 

我已經改變了你的!= NULL!= 1因爲scanf返回一個int結果表示掃描的項目數量,而不是一個指針。

scanf用普通的"%s"格式將任意多個字符讀入指向相應指針參數的數組中。 array是一個數組表達式,但它「衰減」成指向其第一個元素的指針;有關陣列長度如何丟失的任何信息。

您不應該使用"%s"格式的"%s"格式(除非您完全控制程序的標準輸入流中出現的內容)。沒有大小可以讓你的陣列變得安全;如果長度爲10,000個字節,用戶可能會輸入11,000個字符。

像這樣寫過一個數組的邊界導致未定義的行爲。在最壞的情況下,這可能意味着你的程序似乎「正確」工作;超出數組末尾的內存空間可能不會被分配給其他任何內容,因此可能碰巧似乎可用。我把這稱爲最壞的情況,因爲這意味着你有一個很難察覺的錯誤;傳統上,第一次向重要客戶展示代碼時,代碼將發生災難性的失敗。

您可以限制字節scanf的數量將通過指定的最大長度寫入陣列:

scanf("%9s", array); 

我們使用9,而不是10留有餘地終止空字符'\0'

如果你這樣做,你需要決定如果有更多的輸入比適合數組的輸入。將輸入限制爲9個字符可避免數組溢出,但這並不一定意味着您要正確處理更長的輸入。 (在這種情況下,您需要確定「正確」的含義。)

+0

非常感謝您的答案! –

3

的一種方法是,你可以通過書面簡單地限制用戶輸入:

scanf("%9s", array); 

,然後用一個新的值使用memset的

memset (array,'0',MAX_SIZE); 
+0

'memset()'調用真的毫無意義,也被破壞了。將字符串設置爲空就足夠了,即'array [0] ='\ 0';'。 – unwind

1

有沒有問題,此設置之前。只要字符串(包括結尾的null)符合數組的大小,就可以用更長或更短的字符串覆蓋它。沒有必要爲此使用malloc

1

如果輸入的字符數爲保證少,你的字符數組的數量則沒有,你就不會遇到問題。

+0

直指點,謝謝! –

2

主要問題是檢查NULL; scanf返回這將要麼被分配或EOF項目的數量,如果有一個錯誤的int值,使病情應該閱讀

int rc; 
while ((rc = scanf("%s", array)) == 1) 
{ 
    ... 
} 
if (rc == 0) // nothing read 
else if (rc == EOF) // error on read 

雖然是安全的,你應該把一個明確的長度規範就可以了:

while ((rc = scanf("%9s", array)) == 1) 
+0

這很有用。謝謝。 –

1

我建議你fgets去,而不是使用scanf,如果萬一你的輸入流是多字,如"one two"(內9個字符),其中scanf無法讀取它們。

#define MAX 10 
char array[MAX]; 
while(fgets(array, MAX, stdin) != NULL) { ... }