我已经使用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(以及fscanfsscanf)的结果-如果小于您期望的输入数量,则表示匹配失败(您未正确处理某些输入)。如果它是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/

10-11 19:39
查看更多