当我使用函数
这次,第一个输入正常工作,但第二个输入被跳过了。 我做错了什么?
fgets
时,程序会跳过用户输入,影响程序的其余部分。具有此效果的示例程序如下:#include <stdio.h>
int main() {
char firstDigit[2];
char secondDigit[2];
printf("Enter your first digit: ");
fgets(firstDigit, 1, stdin);
printf("\nEnter your second digit: ");
fgets(secondDigit, 1, stdin);
printf("\n\nYour first digit is %s and your second digit is %s.\n", firstDigit, secondDigit);
}
我随后想到问题可能在于fgets
会写入换行符,因此我更改了代码以解决这个问题:
#include <stdio.h>
int main() {
char firstDigit[3];
char secondDigit[3];
printf("Enter your first digit: ");
fgets(firstDigit, 2, stdin);
printf("\nEnter your second digit: ");
fgets(secondDigit, 2, stdin);
printf("\n\nYour first digit is %c and your second digit is %c.\n", firstDigit[0], secondDigit[0]);
}
这次,第一个输入正常工作,但第二个输入被跳过了。 我做错了什么?
char firstLine[4096];
和fgets(firstLine, sizeof(firstLine), stdin);
,然后再考虑如何处理任何多余的字符(忽略它们可能是合适的)。这允许用户输入前导空格。 - Jonathan Lefflersizeof(array)
- 尽管在这里有从size_t
到int
的转换)。您不需要担心“off by one”的问题; 指定完整大小是因为fgets()
不会溢出缓冲区。使用大小为1只允许fgets()
存储一个空字节 - 没有任何数据。因此它成功读取了空内容,速度非常快,并且不改变输入流。 - Jonathan Leffler{LINE_MAX}
应为{_POSIX2_LINE_MAX}
,目前为2048。我将其加倍以满足我的需求。请参阅<limits.h>
。不是每个人都会注意到这种细节,但除非您在一个非常有限的系统上,否则不会有任何问题。(您上次使用少于1 GB主存储器的计算机是什么时候?这使得4 KiB成为总量的微不足道的一部分)。我还这样做是为了震撼效果-以对抗您所遇到的问题。 - Jonathan Lefflermain()
中永久分配,则可能需要担心它,但如果它在从main()
调用的函数中,则无需担心-它将被释放。通过这种方式,您就不必担心处理残留物-当您希望他们输入“1”时,有人键入“123456789012345678900987654321”。人们会滥用您的程序-为输入留出足够的空间可以使他们更难以使您的程序崩溃。 - Jonathan Leffler