我正在创建一个带提示符的命令行应用程序。只要输入内容适合缓冲区,它就能正常工作,但当输入内容较大时,会出现一些奇怪的行为。以下是一个简化的最小示例,具有相同的错误。
当输入内容较大时,处理的是范围内的输入内容,并在下一次循环迭代中,余下的输入内容将立即从
当检测到这种情况时,如何防止它在下一次迭代中读取过长的输入的其余部分?
我在这里看到了类似的问题,但没有一个问题是询问同样的内容。
int main()
{
for (;;) {
const int size = 8;
char str[size];
printf("> ");
fgets(str, size, stdin);
toupper_str(str);
printf("Result: %s\n", str);
}
}
如果输入小于size
,它就能正常工作。
> asdf
Result: ASDF
>
当输入内容较大时,处理的是范围内的输入内容,并在下一次循环迭代中,余下的输入内容将立即从
fgets
返回。这会导致该部分输入内容也被处理并产生一些奇怪的输出。> asdfghjk
Result: ASDFGHJ
> Result: K
>
我可以通过比较最后一个字符与换行符来判断输入是否大于或等于指定大小。只要符合条件,fgets
就会保留换行符。
fgets(str, size, stdin);
if (str[strlen(str) - 1] != '\n') {
fprintf(stderr, "Input too long\n");
}
当检测到这种情况时,如何防止它在下一次迭代中读取过长的输入的其余部分?
我在这里看到了类似的问题,但没有一个问题是询问同样的内容。
fgets
的工作原理。它不会丢弃输入的其余部分,你的代码应该考虑到这一点。如果末尾没有newline
,那么这行就会变得更长(除非它是文件的最后一行)。虽然如果你错过了长度为1,下一个输入可能仅包含一个newline
。 - Weather Vanefgets
字符串没有以newline
(当然是在nul
之前)结尾,则使用getchar
继续读取,直到出现newline
或EOF
。后者:如果输入不包含最后的newline
,则使用分配的缓冲区和realloc
。这里有一个不同的问题,介绍了如何使用这种技术。http://stackoverflow.com/questions/28254245/c-reading-a-text-file-separated-by-spaces-with-unbounded-word-size/28255082#28255082 - Weather Vanerealloc
操作。 - jacwah