gpt4 book ai didi

c - Linux,循环中的 scanf,而标准输入已经加载

转载 作者:可可西里 更新时间:2023-11-01 11:52:04 25 4
gpt4 key购买 nike

我在 linux 上遇到了 scanf 和循环的问题。

#include <stdio.h>
#include <stdlib.h>
#include <stdio_ext.h>

int main(int argc, char ** argv){
int i = 0;
char s[255];
char c;

while(i<10){
printf("Here : ");
scanf(" %s", s);
printf("%s\n", s);
i++;
while((c = getchar()) != '\n' && c != EOF);
}

return EXIT_SUCCESS;
}

如果在 shell Linux 中,如果我这样执行我的文件:

echo "lol" | ./testWhileScanf

那么结果会是这样的:

Here : lol

Here : lol

Here : lol

Here : lol

Here : lol

Here : lol

Here : lol

Here : lol

Here : lol

Here : lol

我不知道为什么会这样,我的一行代码是刷新stdin,不会出现这种问题。

寻求解决方案我尝试过:__fpurgefpurgefflush但都没有用。

我只想得到:

Here ? : lol

Here ? :

等待输入。当然我在这里遗漏了一些东西..但我不知道是什么=/

最佳答案

当你打电话时

scanf(" %s", s);

第一次,它设置slol,并返回1。当您第二次调用它时,没有进一步的输入,因此 scanf 返回零而不设置您的变量。但是,您的代码会忽略 scanf 的返回值,并且无论如何都会打印 s

添加一个检查和一个 break 应该可以解决这个问题:

if (scanf(" %254s", s) != 1) break;

请注意格式字符串中的大小限制器,它将防止 scanf 导致缓冲区溢出。

关于c - Linux,循环中的 scanf,而标准输入已经加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41946633/

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