为什么我在此代码中的加法和乘法部分得到了错误的答案?
#include <stdio.h>
#include <stdlib.h>
int main()
{
char x, y, z;
printf("Enter the calculation: ");
scanf("%c %c %c", &x, &y, &z);
int a = (int)x;
int b = (int)z;
}
问题出在这里:
if(y == '+'){
printf("The answer is %d", a+b);
}
在这里:
else if(y == '*'){
printf("The answer is %d", a*b);
}
else{
printf("Use only +, -, /, * signs");
}
return 0;
}
答案 0 :(得分:2)
首先要了解您正在使用字符变量来获取用户输入,然后将它们转换为整数变量。此类型转换将导致要复制到那些整数变量的字符的ASCII代码值。因此,即使输入输入为3 + 2
,x也将包含值51(ASCII码),z将包含值50(ASCII码),答案将为101,根据代码是正确的。
对于ASCII码,请参阅http://ascii.cl/
此外,您的代码中似乎存在一个小错误(这可能取决于所使用的编译器。我使用Turbo C ++,在这种情况下,像printf之类的任何其他操作之后,我给出了变量声明错误。)
#include <stdio.h>
#include <stdlib.h>
int main()
{
char x, y, z;
int a;
int b;
printf("Enter the calculation: ");
scanf("%c %c %c", &x, &y, &z);
a=(int) x;
b=(int) z;
if(y == '+'){
printf("The answer is %d", a+b);
}
else if(y == '*'){
printf("The answer is %d", a*b);
}
else{
printf("Use only +, -, /, * signs");
}
return 0;
}
此代码工作正常。如果您仍想保留相同的代码,那么只需执行此操作即可。
int a = x - '0';
它会工作。
答案 1 :(得分:1)
字符x,y,z的值是ASCII字符而不是数字。在ASCII中,数字0到9由字符&#39; 0&#39;表示。通过&#39; 9&#39;连续。字符&#39; 0&#39;的int值是十进制48,字符&#39; 1&#39;是49,依此类推。键入&#34; man ascii&#34;从linux提示符中查看ASCII字符的完整列表。
所以转换&#39; 0&#39;到一个int值,减去&#39; 0&#39;从它,你得到0。 因为字符在ASCII表中是连续的,所以这适用于所有10个数字ASCII字符(这不是偶然的,它是以这种方式设计的)。请注意,David指出:虽然除了ASCII之外还有其他编码,但所有编码都要求数字字符是连续的,因此转换为整数的数学运算始终有效。
因此,如果你有任何一个char C,它是来自&#39; 0&#39;的数字字符。到&#39; 9&#39;,你可以使用
获取它的数值int i = C - '0';
a 和 b 的值是错误的,您是使用强制转换将ASCII字符值转换为int,但您需要通过减去该值来转换它角色&#39; 0&#39;:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char x, y, z;
printf("Enter the calculation: ");
scanf("%c %c %c", &x, &y, &z);
// Convert ASCII char to int by subtracting value of char '0'
int a = x - '0';
int b = z - '0';
if (y == '+') {
printf("The answer is %d", a+b);
}
else if(y == '*') {
printf("The answer is %d", a*b);
}
else {
printf("Use only +, -, /, * signs");
}
return 0;
}
要将字符串转换为整数,请使用此帖here中提到的atoi()函数:
char *myString = "1234";
int myIntVal = atoi(myString);
的副本
答案 2 :(得分:0)
x
和z
的值是依赖于实现的整数值,不一定是ASCII值。然而,标准要求'0'
到'9'
的值按顺序排列,因此一种解决方案是更改为:
int a = x - '0';
int b = z - '0';
另一种可能性是使用atoi()
函数(或更好的,strtol()
函数,它增加了错误检查功能),以及复合文字来形成输入字符的字符串:
int a = atoi((char []){x, '\0'});
int b = atoi((char []){z, '\0'});