2013-04-29 112 views
-1

我必須從用戶那裏讀取輸入。我不知道用戶輸入的行數或每行有多少字符,所以我不能使用數組。如果用戶輸入空行,則輸入完成。在C中讀取輸入

我的問題是,如何做到這一點,而不使用數組。我試着使用這個代碼,但它在運行時崩潰。

char *line = ""; 
gets(line); 

爲什麼這不起作用?我怎樣才能讀取輸入不使用數組?

TIA

+1

閱讀關於在C ..字符串字面值有幾千個問題在stackoverflow本身。可能[this](http://stackoverflow.com/questions/164194/why-do-i-get-a-segmentation-fault-when-writing-to-a-string)會幫助你。 – Krishnabhadra 2013-04-29 09:44:58

+0

這是一個字符串文字(一個空字符串),而不是一個字符數組 – 2013-04-29 09:45:41

回答

4

這並不工作,因爲line點,只有足夠的內存來存儲一個空字符串,內存通常是不可修改的,因爲字符串常量不能在運行時改變。

你需要一個實際的緩衝,就像這樣:

char line[128]; 

注意gets()最好避免,也不會防止緩衝區溢出,從而始終將是危險的。

使用fgets()代替:

if(fgets(line, sizeof line, stdin) != NULL) 
{ 
    printf("got some input!\n"); 
} 

你說了,你想這樣做「無陣」某種原因,這是一種...很難,因爲任何「緩衝」是相當多的數組如果你想避免使用[]語法,你需要動態分配內存,而不是使用malloc()

然後你不能像上面那樣使用sizeof它會評估指針的大小。現在你需要:

const size_t buffer_size = 128; 
char *line; 

if((line = malloc(buffer_size)) != NULL) 
{ 
    if(fgets(line, buffer_size, stdin) != NULL) 
    { 
     /* use the data we just read in */ 
    } 
    free(line); /* discard the buffer so we don't leak memory. */ 
} 
+0

,但這隻會讀取1行。 OP說用戶輸入了很多行。你必須使用while而不是如果 – MOHAMED 2013-04-29 09:54:07

+0

關於'gets()'的好處。很多初學者承諾的一個嚴重錯誤 – Krishnabhadra 2013-04-29 09:57:52

+0

準確地說,嘗試修改字符串文字會導致未定義行爲。 – hammar 2013-04-29 09:58:24