在使用scanf读取的char变量中添加两个数字

时间:2014-09-15 02:36:38

标签: c

我正在向朋友教授C编程语言,我们想出了一些我无法解释的东西。这是我们写的代码:

#include <stdio.h>

int main(void)
{
    char num1;
    char num2;

    printf("%s", "Enter the first number: ");   
    scanf("%d", &num1);
    printf("%s%d\n", "The number entered is:", num1);

    printf("%s", "Enter the second number: ");
    scanf("%d", &num2);
    printf("%s%d\n", "The number entered is:", num2);

    printf("%s%d\n", "The first number entered was:", num1); /* This was done for testing */
    printf("%s%d\n", "The sum is:", num1+num2);

    return 0;
}

奇怪的是我们尝试做5 + 6并且我们期望得到11而不是得到6,我添加了一行来查看第一个数字是什么,第二个数字后它变为0号码已被阅读。

我知道变量应该是int(实际上原始代码就是这样并且有效)但我的理解是char是一个小整数,所以我认为它会是&#39;安全&#39;如果我们要添加小数字就可以使用。

代码在具有cc的Linux计算机上和cl的Windows计算机上进行了测试和编译。输出是一样的。在Windows机器上,程序在添加后抛出错误。

我想解释为什么这段代码没有像我预期的那样工作。先谢谢。

2 个答案:

答案 0 :(得分:4)

无法将指向不同数据类型的指针传递给scanfscanf将写入内存,假设您为其指定了预期内容(例如int %d),如果您为其指定不同的数据类型,则会显示出奇妙的未定义行为

在这里,最有可能发生的事情是scanf覆盖,例如当char只占用1个字节时,堆栈上有4个字节,因此scanf只是乐意在堆栈上的其他变量上写一个字段。

答案 1 :(得分:3)

  

char是一个小整数,所以如果我们添加小数字,我认为使用它是“安全的”。

这是正确的,char是一个小的整数类型,并且可以在整数运算中使用它(尽管char可能是有符号或无符号的,这可能会导致结果意外)。

但问题是,指向char 的指针不能用于预期指向int 指针的地方。 scanf("%d", &num1);就是这种情况,第二个参数的类型为int *