8.1 為什麼這段代碼不行?char *answer; printf("Type something:\n"); gets(answer); printf("You typed \"%s\"\n", answer);

指針變量 answer, 傳入 gets(), 意在指向保存得到的應答的位置, 但卻沒有指向任何合法的位置。換言之, 我們不知道指針 answer 指向何處。 因為局部變量沒有初始化, 通常包含垃圾信息, 所以甚至都不能保證 answer  是一個合法的指針。參見問題 1.10 和 5.1

改正提問程序的最簡單方案是使用局部數組, 而不是指針, 讓編譯器考慮分配的問題:

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

	char answer[100], *p;
	printf("Type something:\n");
	fgets(answer, sizeof answer, stdin);
	if((p = strchr(answer, '\n')) != NULL)
	    *p = '\0';
	printf("You typed \"%s\"\n", answer);

本例中同時用 fgets() 代替 gets(), 以便 array 的結束符不被改寫。 參見問題 12.20。不幸的是, 本例中的 fgets() 不會像 gets()  那樣自動地去掉結尾的 \n。 也可以用 malloc() 分配  answer 緩衝區。

翻譯朱群英、孫雲, LaTeX2HTML 編譯 朱群英 (2005-06-23)