cprinting使用整数赋值给字符的Ascii

时间:2016-01-04 16:44:48

标签: c char ascii

我正在尝试打印Ascii字符,我发现使用char c = NUM; printf("%c", c);可以用于某些数字(尝试使用某些字母表的Ascii数字)但有些会导致运行时错误,为什么会这样?

#include <stdio.h>

int main(void) {
    for(int i = 0; i < 128; i++){
        printf("%c", i); // WORKS FINE
    }

    for(char c = '!'; c < '~'; c++){
        printf("%c", c); //WORKS FINE
    }

    #if 0
    for(char d = 0; d < 128; d++){
        printf("%c", d); //IF REMOVED #if 0 --> RUNTIME ERROR
    }
    #endif

    // HOWEVER
    char e = 105;
    printf("%c", e); //OK
    return 0;
}

那么,为什么最后一部分工作而第三部分for循环不是?

修改

在看到下面的答案后,我明白我的循环已经病态了,我应该在127而不是128时停止它。但是,当我尝试这个改变时 - 它根本没有输出:

for(unsigned char c = 0; c < 255; c++){
    printf("%c", c);
}

AND

for(char c = -128; c < 127; c++){
    printf("%c", c);
}

3 个答案:

答案 0 :(得分:5)

使用警告进行编译总是有帮助:

char.c:9:2: warning: comparison is always true due to limited range of data type [-Wtype-limits]
  for(char d = 0; d < 128; d++){
  ^

签名角色可以容纳的最大值是127.因此,循环永远不会结束,并且会在-128到127之间永久循环。

编辑:

但正如@SilasAbrusco所提到的:当d增加到127之后,行为实际上是未定义的,请参阅:Is signed integer overflow still undefined behavior in C++?

答案 1 :(得分:2)

char显然是您系统上的签名类型。这意味着最大的值是+127。

所以你的for循环永远不会终止。实际上你有未定义的行为,因为你将溢出签名的char类型。

char 未签名的平台上,您的for循环可行。但它不便携。

此外,printf使用低于32的char会在您的终端上做一些奇怪的事情,因为它们是控制字符。例如,7可能会发出哔哔声。

for(unsigned char c = 32; c <= 126; c++){
    printf("%c", c);
}

肯定会正确打印。

答案 2 :(得分:0)

你有char变量的问题,因为它是签名你已经使用了位符号显示字符,所以当你有 1 1111111时你的情况是-127不是128所以 d 低于 128 所以for循环继续d ++ = -126,...等,所以for循环:

 Dictionary<int, List<MyObj>>