当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
}
答案 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;