gpt4 book ai didi

c - Scanf 在整数变量中存储错误的值

转载 作者:行者123 更新时间:2023-11-30 20:29:13 25 4
gpt4 key购买 nike

我使用 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) 当我使用 Debug模式运行代码时,我可以看到 ll 值为 65,而不是 67!

最佳答案

通过在 "5h""2t"dd 条目中输入非数字字符,您会弄乱读取for 第二个 scanf 调用中的 ll

%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/

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