gpt4 book ai didi

c - 如何检查 scanf() 在 C 中是否正常工作?

转载 作者:行者123 更新时间:2023-11-30 17:08:14 25 4
gpt4 key购买 nike

我正在尝试查看用户是否输入了 3 个正确的输入。如果不是,循环会一次又一次地要求输入,直到他们正确纠正为止。

#include <stdio.h>
int main(void) {

int num1,num2;
char str;
int check;

printf("Enter : ");
check = scanf("%d,%d, %c", &num1, &num2, &str);

while (check != 3) {

printf("Enter : ");
check = scanf("%d,%d, %c", &num1, &num2, &str);
}


}

假设我输入 a, 5.4, c我们得到一个无限循环。为什么会出现无限循环?

最佳答案

在循环中错误使用 scanf 的方法远多于正确的方法。主要问题(除了手册页中解释的输入匹配失败之外)是无法清空输入缓冲区(stdin 从终端读取时)转换失败后。 (还有一个问题是用户必须输入一些内容。)当用户输入文本并按 [Enter] 时,会出现 换行符 ('\n') 生成并放置在输入缓冲区中以标记行尾。当您输入 a, 5.4, c 时,'a' 没问题,但 5.4 不是 int 并且处理失败:

If processing of a directive fails, no further input is read, and scanf() returns.

scanf 返回时,它将剩余的字符保留在 stdin 中,并且您循环并尝试再次读取。 scanf 尝试读取 stdin 中剩余的内容,再次处理失败,循环无限继续。

在这种情况下,防止无限循环的唯一方法是在调用 scanf 后手动清空输入缓冲区。一些简单的事情就可以了:

int c;
...
while (...) {
scanf (...)
while ((c = getchar()) != '\n' && c != EOF) {}
}

这将确保您在下一次迭代时从空缓冲区开始。例如:

#include <stdio.h>

int main (void) {

int num1 ,num2, c;
char str;

while (printf ("\nEnter : ") &&
scanf (" %d, %d, %c%*c", &num1, &num2, &str) != 3) {
printf ("error: invalid input, required: 'int, int, char'\n");

/* empty remaining chars from input buffer */
while ((c = getchar()) != '\n' && c != EOF) {}
}

printf ("\n num1 : %d\n num2 : %d\n str : %c\n\n", num1, num2, str);

return 0;
}

使用示例

$./bin/scanf3

Enter : a
error: invalid input, required: 'int, int, char'

Enter : a, 5.4, c
error: invalid input, required: 'int, int, char'

Enter : 10, 25
error: invalid input, required: 'int, int, char'

Enter : 10, 25, a

num1 : 10
num2 : 25
str : a

注意:这并不能防止用户不输入任何内容(只需按[Enter])并且光标在等待输入时只是坐在那里闪烁。这是 scanf 的固有行为,部分原因是面向行的输入方法(fgets 或 getline) code>) 在接受输入时更可取。

关于c - 如何检查 scanf() 在 C 中是否正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33770606/

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