我已经使用c编程语言(标准89)编写了以下代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int cc,dd;
scanf("%d/%d",&cc,&dd);
int ll;
scanf("%d",&ll);
printf("Value of ll is: %d",ll);
return 0;
}
如果我在一行中输入以下内容作为输入:
4/5h
我得到以下输出:Value of ll is: 67
所以我有两个问题;
1)67的价值来自何处? (我试图将输入更改为1 / 2t,但结果相同)
根据我所读的内容,由于缓冲区中没有整数,因此应用程序应等待一个整数可用(例如,等待新输入)
2)当我使用调试模式运行代码时,我可以看到ll值为65而不是67!
最佳答案
通过在诸如"5h"
或"2t"
的dd
条目中键入非数字字符,您将在第二个ll
调用中破坏scanf
的读取。%d
告诉scanf
跳过任何前导空格,然后读取十进制数字字符,直到第一个非数字字符。如果您输入"5h"
或"2t"
之类的字符串,则该前导数字将被成功转换并分配给dd
,但是尾随的非数字字符将保留在输入流中,这将破坏读取ll
。没有新值读入ll
,您将获得程序启动时具有的不确定值。
始终检查scanf
(以及fscanf
和sscanf
)的结果-如果小于您期望的输入数量,则表示匹配失败(您未正确处理某些输入)。如果它是EOF
,则输入流本身将失败。
对于这种特殊情况,您可以通过检查scanf
的结果来解决该问题-如果它是0
,则说明流中有一个坏字符。扔掉,然后重试:
int r;
while ( ( r = scanf( "%d", &ll ) ) != 1 && r != EOF )
getchar();
这将调用
scanf
并尝试将值读入ll
。我们希望scanf
在成功输入时返回1
,因此我们将在scanf
的结果不是1
(也不是EOF
)时循环。如果读取不成功,我们假定输入流中有一个非数字字符,因此我们通过getchar
调用读取并丢弃它。关于c - Scanf在整数变量中存储错误的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58698026/