我对C很新,但我在编写一个需要用户输入的程序时遇到了一些麻烦。这是我遇到问题的代码:
int xPos, yPos;
while(1)
{
printf("Enter two integers: ");
if(scanf("%d %d", &xPos, &yPos) == 2)
{
printf("success \n");
}
else
{
printf("fail");
}
}
示例贯穿我想要的内容如下:
Enter two integers: 4 4
success
Enter two integers: 13
fail
enter two integers: sda asd
fail
它会继续前进
但我得到的是:
Enter two integers: 4 4
success
Enter two integers: 13
5 (it goes onto a new line for me and I have to enter something else to make it keep going)
fail
Enter two integers: sda asd
Enter two integers:Enter two integers:Enter two integers:Enter two integers:Enter two integers:Enter two integers:Enter two integers:Enter two integers:Enter two integers:Enter two integers:Enter two integers: and on and on.. you get the idea.
关于我做错了什么的暗示?我想在输入按钮被击中后立即扫描。
答案 0 :(得分:1)
那是因为scanf
只会等到你输入两个整数(除非它得到错误或文件结束)。它不关心在这种情况下是否存在换行符,它会抛弃它们并等待另一个整数。
如果你想处理行,,你应该使用fgets
来获取一行,然后使用sscanf
来提取整数。
有关从标准输入获取线路的安全方法,请参阅this answer。除此之外,只需稍加修改即可将scanf (...)
转换为sscanf (buffer, ...)
。
答案 1 :(得分:0)
scanf('%d %d'...
继续扫描标准,直到它看到它正在寻找的两个整数。一种解决方案是尝试接受一个字符串然后使用atoi来确定它是否采用正确的格式,尽管可能有更好的解决方案。
答案 2 :(得分:0)
这是scanf
的弱点。而是使用fgets(buf,sizeof buf,stdin)将整行读作文本,然后使用sscanf尝试从行中提取值。
如果数据表现良好,也可以使用gets()
。但正如有人正确指出的那样,与gets()
一起使用的缓冲区很容易导致令人讨厌的缓冲区溢出。