我是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.有什么关于我哪里做错了的提示吗?我希望一旦按下enter按钮,它就会扫描。
发布于 2011-03-19 15:08:15
这是因为scanf会一直等到你输入两个整数(除非它得到一个错误或者文件的结尾)。在这种情况下,它不关心是否有换行符,它将丢弃它们并等待另一个整数。
如果您想要处理行,您应该使用fgets获取一行,然后使用sscanf提取整数。
有关从标准输入获取行的安全方法,请参阅this answer。除此之外,将您的scanf (...)转换为sscanf (buffer, ...)只是一个很小的修改。
发布于 2011-03-19 15:07:42
scanf('%d %d'...不断向内扫描标准,直到它看到它要查找的两个整数。一种解决方案是尝试接受一个字符串,然后使用atoi来查看它的格式是否正确,尽管也可能有更好的解决方案。
发布于 2011-03-19 15:08:42
这是scanf的一个弱点。取而代之的是使用fgets(buf,sizeof buf,stdin)将整行作为文本读取,然后使用sscanf尝试从该行提取值。
如果数据表现良好,也可以使用gets()。但正如有人正确地指出的那样,与gets()一起使用的缓冲区很容易导致严重的缓冲区溢出。
https://stackoverflow.com/questions/5360704
复制相似问题