我想将char转换为int。但是当我使用通常的
方式时convertedInt = c - '0';
打印结果时,我得到一个额外的负数。例如,带有输入654的代码产生输出:
while (c != '\n'){
c = getchar();
convertedInt = c - '0';
printf("%d\n", convertedInt);
}
//Output
4
5
6
-38
我认为它与getchar没有任何关系,因为如果我只打印char而不转换它,我得到预期的输出。
答案 0 :(得分:4)
您在阅读角色之前正在测试。试试这个:
int c;
while ((c = getchar()) != '\n' && c != EOF) {
convertedInt = c - '0';
printf("%d\n", convertedInt);
}
请注意,如果发生错误,getchar()
可以返回EOF
,或者如果用户从键盘发出EOF
信号,那么c
应该针对此进行测试值以避免可能的无限循环。
在问题的代码中,似乎while
语句的控制表达式第一次测试c
未初始化的值。这导致未定义的行为。之后,当读取并打印最后一位数字时,再次测试c
,发现不是\n
。然后调用getchar()
,c
的值为10
,即ASCII中换行符的十进制值。因此,convertedInt
获取值10 - 48
或-38
。然后c
最后一次测试;现在等于\n
,循环终止。
答案 1 :(得分:3)
首先,getchar
返回一个int
,它通常包含最低字节的字符代码。它返回int
的原因是它必须能够返回EOF
的值,该值不同于任何可能的unsigned char
值。 EOF
用于表示输入的结束,并不意味着将其视为字符输入。在许多系统上,EOF
的值为-1。
您看到的值是ASCII中的'\n' - '0' == 10 - 48
。
以下是处理来自getchar()
:
while((c = getchar()) != EOF && c != '\n') {
if(c >= '0' && c <= '9') {
convertedInt = c - '0';
printf("%d\n", convertedInt);
}
}
可以通过添加#include <ctype.h>
并将if
语句的条件更改为if(isdigit(c))
来实现类似的检查。
答案 2 :(得分:2)
执行getChar()
时,您稍后会检查\n
,但是您先减去'0'。替换为
while(1){
c = getchar();
if(c == '\n')
break;
convertedInt = c - '0';
printf("%d\n", convertedInt);
}