0

我有个问题。当我声明“x”整数时,程序可以正常工作,但是当我删除“x”时,它会显示一个奇怪的结果。

 #include <stdio.h>
    #include <conio.h>
    main ()
    {
        int a,b,x;
        char ras;
        printf("Insert a: ");
        scanf("%d", &a);
        printf("Insert b: ");
        scanf("%d", &b);
        printf("Sum or multuply: (s/m)");
        scanf("%s", &ras);
        if (ras=='s')
        {
            printf("Sum is :%d", a+b);
        }
        else if (ras=='m')
        {
            printf("Multiply is :%d", a*b);
        }
        getch();
    }
4

3 回答 3

2

您的程序以任何一种方式调用未定义的行为,因为scanf存储了两个字符(输入的字母加上尾随的 0 字节),但是您给它的指针指向一个只能包含单个字符的变量。

在您的特定实现中,如果该变量存在,则 0 字节将简单地覆盖 x 变量。如果不是,你会覆盖其他东西,导致你奇怪的结果。

要读取单个字符,您应该使用%c,而不是%s

于 2013-10-27T18:34:17.070 回答
1

不要将“%s”放在 scanf 模式中,它是一个字符串 - 至少两个字符(你想要的加上 NULL)。请改用 %c。

http://www.cplusplus.com/reference/cstdio/scanf/

于 2013-10-27T18:36:19.317 回答
0

那是因为您的代码调用了未定义的行为,显然,它正在做这个“有趣”的事情。

UB 的原因是%s转换说明符使得scanf()在刚刚扫描的字符之外附加一个终止 NUL 字符,但是没有空间,所以它写入未分配的内存......


改为使用%c更好的是,完全摆脱scanf()它,这是邪恶的。改用一个健全的函数,例如getchar(), 。

于 2013-10-27T18:34:38.053 回答