使用getchar()额外数字将char转换为Int

时间:2017-02-11 04:23:43

标签: c ascii

我想将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而不转换它,我得到预期的输出。

3 个答案:

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