【发布时间】:2014-04-07 09:29:08
【问题描述】:
我正在尝试使用 fgets() 获取一个字符的输入。据我所知,除非没有空间,否则 fgets 会将 \n 添加到输入的末尾。
char test[1];
fgets(test,1,stdin);
readRestOfLine();
while (strcmp(test,"z") != 0){
......
......
}
无论如何,即使输入 z,循环也不会运行。这是为什么呢?
【问题讨论】:
我正在尝试使用 fgets() 获取一个字符的输入。据我所知,除非没有空间,否则 fgets 会将 \n 添加到输入的末尾。
char test[1];
fgets(test,1,stdin);
readRestOfLine();
while (strcmp(test,"z") != 0){
......
......
}
无论如何,即使输入 z,循环也不会运行。这是为什么呢?
【问题讨论】:
man fgets
char *fgets(char *s, int size, FILE *stream);fgets() 从 stream 中读取最多小于 size 个字符,并且 将它们存储到 s 指向的缓冲区中... 终止空字节('\0')存储在最后一个字符之后 缓冲区。
在您的 size 1 的情况下,这意味着 fgets() 读取为零,即。 e.不,字符并将终止的 '\0' 存储在 test[0] 中。
【讨论】:
strcmp 从其名称对字符串进行如下操作,因此test 必须是\0 终止的字符串。 test 必须为\0 留出空间。
【讨论】:
正如你所说的,fgets 在字符串末尾附加了一个“\n”。所以如果你只输入“z”,那么结果字符串将是“z\n”,它不等于“z”。
此外,fgets 的缓冲区大小仅适用于程序中的字符长度,但此长度必须至少与您打算输入的最长字符串一样长。
试试这个:
char test[100]; // space for 98 characters + \n + terminating zéro
fgets(test, 100, stdin);
readRestOfLine();
while (strcmp(test,"z\n") != 0){
......
......
}
【讨论】: