gpt4 book ai didi

c - 在C中使用scanf解析输入

转载 作者:行者123 更新时间:2023-11-30 16:51:45 25 4
gpt4 key购买 nike

我在尝试弄清楚如何使用 scanf() 时遇到了很多问题。它似乎可以很好地处理整数,相当简单 scanf("%d", &i)

我遇到问题的地方是在循环中使用 scanf() 尝试读取输入。例如:

do {
printf("counter: %d: ", counter);
scanf("%c %c%d", &command, &prefix, &input);
} while (command != 'q');
  1. 当我输入像 c P101 这样的有效结构化输入时,它似乎在提示我之前再次循环。即使只有一个,这似乎也会发生:

    scanf("%c", &c) 

    在 while 循环中。在再次提示我之前,它会循环两次。是什么让它循环两次,如何停止它?

  2. 当我输入的输入量较少,而以编程方式不会有其他字符或数字(例如 q)时,按 Enter 似乎会提示我输入更多内容。如何让 scanf() 处理单字符和双字符输入?

最佳答案

当您输入“c P101 ”时,程序实际上接收到“c P101\n ”。大多数转换说明符都会跳过前导空格,包括换行符,但 %c才不是。第一次读取“\n”之前的所有内容,第二次将“\n”读取到command。 ,“c”被读入prefix ,并且留下的“P”不是数字,因此转换失败并且“P101\n”留在流中。下次将“P”存储到命令中时,“1”存储到前缀中,并且1 (来自剩余的“01”)被存储到输入中,“\n”仍然在流上以供下次使用。您可以通过在格式字符串的开头放置一个空格来解决此问题,这将跳过任何前导空格,包括换行符。

第二种情况也发生类似的情况,当您输入“q”时,“q\n”被输入到流中,第一次围绕“q”被读取,第二次“\n”被读取,只有在第三次调用时才会读取第二个“q”,您可以通过在格式字符串的开头添加空格字符来再次避免该问题。

更好的方法是使用 fgets() 之类的方法一次处理一行,然后使用 sscanf() 进行解析。

关于c - 在C中使用scanf解析输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41602184/

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