gpt4 book ai didi

c - 使用 fgets 从 stdin 读取,如果输入大于大小,则会出错

转载 作者:行者123 更新时间:2023-12-02 09:32:53 25 4
gpt4 key购买 nike

我正在创建一个带有提示的命令行应用程序。只要输入适合缓冲区,它就可以正常工作,但是当输入较大时,我会出现一些奇怪的行为。下面是一个简化的最小示例,它具有相同的错误。

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

>

我可以通过将最后一个字符与换行符进行比较来查看输入是否大于或等于 size。 fgets只要它适合,就保留换行符。
fgets(str, size, stdin);
if (str[strlen(str) - 1] != '\n') {
fprintf(stderr, "Input too long\n");
}

当检测到这种情况时,如何阻止它在下一次迭代中读取剩余的过长输入?

我在这里看到过类似的问题,但没有人提出同样的问题。

最佳答案

how do I stop it from reading the rest of the too long input on the next iteration?



代码需要 1) 检测输入是否“太长” 2) 消耗额外的输入。
fgets()不会溢出它的缓冲区。如果它确实填充了缓冲区,最后一个 char缓冲区中是 '\0' .所以将其设置为非 '\0'读之前。然后代码知道是否整个缓冲区都被填满了。然后检查前面的 char 是否是 '\n' .如果不是行尾,则附加 char可能存在于 stdin
char str[100];  // Insure buffer is at least size 2
for (;;) {
str[sizeof str - 1] = `x`;
if (fgets(str, size, stdin) == NULL) {
// No more to read or IO error
break;
}
int extra_data_found = 0;
if (str[sizeof str - 1] == '\0' && str[sizeof str - 2] != '\n') {
// Cope with potential extra data in `stdin`: read and toss
int ch;
while ((ch = fgetc(stdin)) != '\n' && ch != EOF) {
extra_data_found = 1;
}
}
// Use `str` as needed, noting if additional unsaved data found
foo(str, extra_data_found);
}

注意:关于文件错误, fgets()返回 NULL以及 str 的内容未定义。

注意:代替 str[sizeof str - 1] == '\0' , 代码可以使用 strlen(str) == sizeof str - 1 .这应该被愚弄 fgets()读取空字符 '\0' .

角落案例:
1.典型 str将高达 98 char然后 '\n''\0' .是不是最后一个 str是 99 char然后 '\0' ?
2.如果#1没问题,那么可能是典型的 str有 99 char然后 '\0' ?

关于c - 使用 fgets 从 stdin 读取,如果输入大于大小,则会出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30811325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com