我必須從用戶那裏讀取輸入。我不知道用戶輸入的行數或每行有多少字符,所以我不能使用數組。如果用戶輸入空行,則輸入完成。在C中讀取輸入
我的問題是,如何做到這一點,而不使用數組。我試着使用這個代碼,但它在運行時崩潰。
char *line = "";
gets(line);
爲什麼這不起作用?我怎樣才能讀取輸入不使用數組?
TIA
我必須從用戶那裏讀取輸入。我不知道用戶輸入的行數或每行有多少字符,所以我不能使用數組。如果用戶輸入空行,則輸入完成。在C中讀取輸入
我的問題是,如何做到這一點,而不使用數組。我試着使用這個代碼,但它在運行時崩潰。
char *line = "";
gets(line);
爲什麼這不起作用?我怎樣才能讀取輸入不使用數組?
TIA
這並不工作,因爲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. */
}
,但這隻會讀取1行。 OP說用戶輸入了很多行。你必須使用while而不是如果 – MOHAMED 2013-04-29 09:54:07
關於'gets()'的好處。很多初學者承諾的一個嚴重錯誤 – Krishnabhadra 2013-04-29 09:57:52
準確地說,嘗試修改字符串文字會導致未定義行爲。 – hammar 2013-04-29 09:58:24
閱讀關於在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
這是一個字符串文字(一個空字符串),而不是一個字符數組 – 2013-04-29 09:45:41