Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 非预期计划结果(添加字母)_C - Fatal编程技术网

C 非预期计划结果(添加字母)

C 非预期计划结果(添加字母),c,C,在我最近开始学习C语言的过程中,我做的第一件事就是一个非常基本的“两个数之和程序” /*基本添加程序*/ #包括 内部主(空){ int v_1;/*第一个变量*/ int v_2;/*第二个变量*/ int answer;/*两个变量之和*/ printf(“简单加法计算器”); printf(“输入第一个数字:”); scanf(“%d”&v_1); printf(“输入第二个数字:”); scanf(“%d”和v_2); 答案=v_1+v_2; printf(“%d\n”,答案); }

在我最近开始学习C语言的过程中,我做的第一件事就是一个非常基本的“两个数之和程序”

/*基本添加程序*/
#包括
内部主(空){
int v_1;/*第一个变量*/
int v_2;/*第二个变量*/
int answer;/*两个变量之和*/
printf(“简单加法计算器”);
printf(“输入第一个数字:”);
scanf(“%d”&v_1);
printf(“输入第二个数字:”);
scanf(“%d”和v_2);
答案=v_1+v_2;
printf(“%d\n”,答案);
}
当我运行此程序并输入2个数字时,一切正常,我将得到正确答案。 输出将如下所示:

输入第一个数字:1

输入第二个数字:1

=2

我决定试着用字母而不是数字来打破它,因为一开始我希望输入两个字母,它要么将它们转换成数值,要么会出错并崩溃

然而,事实并非如此,我得到以下结果:

输入第一个数字:a

输入第二个数字:=32765

我的问题不是“我如何解决这个问题”,而是“这里到底发生了什么?”

编辑 同样,这个问题更多的是试图理解正在发生的事情,而不是试图解决一个问题。我不是在寻找“如何避免这种情况?”我在寻找“是什么导致了它以及为什么?”

博士 我真的可以把我想知道的简化为两个问题

为什么我输入的每个字母都有唯一的垃圾数据? i、 e每次输入a时为32764,每次输入b时为32767


为什么跳过第二个变量输入?

检查
scanf(“%d”和&v_1)的结果;
。如果它不是1,则不会更新
v_1

为什么跳过第二个变量输入


scanf(“%d”和&v_1);
输入非数字输入既不会使用该输入,也不会更改
v_1

这也是为什么
scanf(“%d”和&v_2);
没有等待输入,它试图使用相同的输入,但也失败了

为什么我输入的每个字母都会得到唯一的垃圾数据?例如,每次输入a时32764,每次输入b时32767

代码只是获取v_1,v_2的未初始化值。优化编译器甚至可能不会“创建”v_1,直到scanf(“%d”,&v_1)出现因此未初始化的
v_1
可能取决于输入的文本。由于这是未定义的行为,因此明天或其他机器上的结果可能不同

对初始化值尝试相同的操作

int v_1 = 0; /* first var */
int v_2 = 0;

我不太清楚你想说什么。代码可以处理任何整数。问题只在使用字母作为输入时出现。所有将变量设置为0的操作都是将输出从32765更改为0…这很有趣,但无助于解释这里实际发生了什么…或者为什么输出32765正在发生而现在没有发生。如果我去返回并使用不同的字母输出是不同的B例如,给出输出“32767”@Spooler
scanf(“%d”,&v_1);
不读取
“a“
因为它不是解释为
int
的文本。该文本保留在
stdin
v_1
没有更改。@后台处理程序32765只是一个垃圾值,您没有初始化变量,所以它只得到了内存位置中剩余的内容。这里没有什么神奇之处,如果重新启动计算机并再次运行程序,它肯定会得到一个不同于32765的值
“a”
“b”
不会更改
v_1
@Spooler作为验证,您可以为
v_1
指定一个给定值,并查看插入错误输入后是否会更改。(它没有)。它没有做你期望的两件事。实际上,它什么也没做。@Spooler:scanf函数返回一个值。您需要对其进行测试,以便知道
scanf
是否成功读取(并分配)了一个值。你应该养成检查返回码的习惯…这个问题的要点可能重复的地方似乎完全被忽略了我不想知道如何解决这个问题我想知道这里到底发生了什么为什么它会给我它给出的垃圾输出,为什么它会跳过第二个值?
int v_1 = 0; /* first var */
int v_2 = 0;