gpt4 book ai didi

c - 输入不匹配的字符串时,Scanf 在 while 循环中不起作用

转载 作者:行者123 更新时间:2023-12-03 15:27:04 25 4
gpt4 key购买 nike

我正在使用一个名为 的函数checkType 检查用户是否输入了整数类型的有效输入。例如,如果用户输入 15,它将打印 有效 和 15c 将打印 无效 .但是,如果用户只输入一个字符串 input 就像 ccccc ,这会导致无限循环并且程序崩溃。我在下面添加了一些屏幕截图来显示输出。

int checkType(int input, char *c) {
if (input == 2 and *c == '\n') {
return 1;
} else {
return 0;
};
}

int main(void) {
int faces = 0;
char c;
int valid = 0;
int input;

while (valid == 0) {
printf("Enter number of faces: ");
input = scanf("%d%c", &faces, &c);
valid = checkType(input, &c);
printf(valid == 0 ? "not valid\n" : "valid\n");
}
}
enter image description here
无限循环:
enter image description here

最佳答案

scanf()函数族并不是真正用于输入有问题的语法。
解决问题的常用方法是以肯定会成功的方式读入所有输入,例如通过使用 fgets() 读取完整行(而不是数字、类似单词的字符串或任何其他具有预期格式的内容) .
然后您可以尝试按照预期格式解析该行表示字符串。 (您可以使用 sscanf() 进行解析尝试。)如果失败,您可以忽略它并阅读下一行,或者尝试根据相同输入的替代允许格式进行解析。
相关的区别在于读取整行将成功并将其从输入流中删除。与此相反,您的代码在语法失败的情况下,会在输入流中留下与预期语法不匹配的任何内容。因此,当然,它会再次使读取循环的下一次迭代失败。这就是导致你无限循环的原因。
详细:

  • 将整行读入缓冲区,
    使用 fgets()以及将字符数限制为缓冲区大小的选项
  • 此时所有行都从输入(又名标准输入,又名输入流)中删除,
    这意味着即使读取的行不匹配任何允许的格式,下一次读取也会获得新的输入,
    这是与尝试直接使用 scanf() 读取输入的相关区别
  • 从行缓冲区,尝试根据允许的格式读取单独的值,
    使用 sscanf()并检查返回值
  • 如果成功了,你就填充了你期望的变量(例如一个整数);
    您可以尝试扫描其他的、未覆盖格式的尾随输入(并继续像错误输入一样,即使行首匹配允许的格式)
  • 如果不成功尝试不同的允许格式,
    使用 sscanf()再次,
    来自同一行缓冲区,即使格式部分匹配,也不会更改
  • 如果没有允许的格式与输入匹配,则认为它不正确
  • 不正确的输入可以被忽略或可能导致程序中的致命解析错误,您的选择
  • 关于c - 输入不匹配的字符串时,Scanf 在 while 循环中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64870792/

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