Scanf不会将用户输入的值分配给变量| C

时间:2015-09-21 00:00:10

标签: c

当scanf用于获取计算的第二个整数时,它会指定0到sec而不是用户输入的值。请帮助!

// This program will act as a basic calculator`enter code here`
// The user will input two numbers and an operand. The program will print
// the result of the operation

#include<stdio.h>
int main()
{
    int first; //Variable for the first input of the user
    int sec;   //Variable for the second input of the user
    char operand[1]; //Variable for the operand inputed by the user
    int op, answer; //Dummy Variables for temp use
    printf("This is a simple calculator. Make sure you don't divide by 0!!\n");
    printf("Enter your first integer: ");
    scanf("%d", &first); //Ask the user to input the first number for the     calculation
    printf("\nEnter your second integer: ");
    scanf("%d", &sec); //Ask the user to input the second number for the calculation
    printf("Enter the operand.\n");
    scanf("%s", operand); //Ask the user to input the operand of the     calculation (+,-,*,/)
    printf("%i %s %i\n", first, operand, sec); //Display the calculaiton to be made
    op = (int) operand[0]; // converts the operand to an ASCII value
}

4 个答案:

答案 0 :(得分:2)

char operand[1]; //Variable for the operand inputed by the user

C使用以null结尾的字符串。这意味着最小的字符串(&#34;&#34;)将只包含1个字符:0x00

当您尝试阅读类似&#34; +&#34;从输入中,这是一个由两个字节组成的字符串:0x2B 0x00。由于内存仅分配给单个字符(operand[1]),0x2B在此处,终止空0x00意外地转到sec变量。

这称为buffer overflow。在您的情况下,解决方案是为字符串分配更多空间,或仅使用单个字符。

答案 1 :(得分:1)

添加到this answer这是正确的,因为它解决了实际问题,您可能希望指示scanf()只扫描一个字符,例如

scanf(" %c", operand);
/*     ^ this is needed with the %c specifier in order to skip spaces */

但是在使用operand时你必须​​要小心,因为它不是一个字符串,它只是一个字符的数组,并且像这样使用它

printf("%i %s %i\n", first, operand, sec);

将调用未定义的行为,因为printf()会尝试读取operand数组的末尾。

你也可以这样做,

char operand;

scanf(" %c", &operand);
/*     ^ this is needed with the %c specifier in order to skip spaces */

在这种情况下,printf()会更改为

printf("%d %c %d\n", first, operand, sec);
/*       ^ is normally used instead of %i, though %i is correct */

答案 2 :(得分:0)

我将操作数更改为单个字符,程序正常运行!谢谢你的帮助

答案 3 :(得分:0)

变量:operand只有1个字节长。

但是,使用scanf(),

输入%s时

scanf将始终附加一个NUL字节。

因此代码执行一些未定义的行为,这可能导致任何事情,包括seg fault事件

这一行:

op = (int) operand[0]; // converts the operand to an ASCII value

不会转换&#39;操作数&#39;到ascii值,它已经是一个ascii值(I.E + - / * etc)

它实际上做的是转换char&#39;操作数&#39; to int&#39; op&#39;