2015-05-04 51 views
4

我有一个简单的程序是这样的:通过添加'0'将整数转换为char - 发生了什么?

#include <stdio.h> 

int main(void) 
{ 
    int numbers[] = {1, 2, 3, 4, 5}; 
    char chars[] = {'a', 'i'}; 
    char name[] = "Max"; 

    name[1] = chars[1]; 

    printf("name (before) = %s\n", name); 

    name[1] = numbers[1]; 

    printf("name (after) = %s\n", name); 

    return 0; 
} 

编译和运行提供了:

$ gcc -std=c11 -pedantic -Wall -Werror ex8_simple.c 
$ ./a.out 
$ name (before) = Mix 
$ name (after) = Mx 

这是不是我想要的。然后我挖出了问题Store an integer value in a character array in C和改变这样的程序:

name[1] = '0' + numbers[1]; //replacing >> name[1] = numbers[1]; 

然后它怎么会想到:

$ gcc -std=c11 -pedantic -Wall -Werror ex8_simple.c 
$ ./a.out 
$ name (before) = Mix 
$ name (after) = M2x 

我不明白什么抽油烟机下发生虽然,特别是没有'0' + …的版本真的很奇怪。为什么字符串以“奇怪”的方式被截断为Mx

仅供参考,这是exercise 8 of Learn C The Hard Way的简化版本。

+2

将程序的输出输出到'hexdump -C'并查看输出。字符'0'的Ascii值是'48'(dec),通过在'48'上加2得到ascii值'50',即2的字符。 –

+1

这与Ascii代码有关。如果你声明'int numbers [] = {'1','2','3','4','5'};'那么你不需要添加''0''。 – tivn

回答

8

每个符号都有一个数字表示,所以基本上每个字符都是一个数字。这里是字符及其值的表格。

http://www.asciitable.com/index/asciifull.gif

所以,在你的代码name[1] = numbers[1];,分配给name[1]2,这等于在上面的ASCII表,这是不是一个可打印字符符号STX,这就是为什么你会得到不正确的输出。

当您添加'0'name[1],它等于add 48 to 2,所以用数50的符号是'2',这就是为什么你会得到正确的输出。

4

这不是我想要的。

但是,您已经为此编写了代码。让我解释这两种情况。

  • name[1] = chars[1]; 
    

name[1]a情况越来越替换chars[1]i。所以,O/P是Mix

  • name[1] = numbers[1]; 
    

name[1]a情况越来越替换numbers[1]或2,(未'2'),这是不可打印的。 (#note)所以输出是Mx

然而,在你的第二个方法,

name[1] = '0' + numbers[1]; 

你存储的'2'的ASCII等价值,通过增加'0'。因此,该输出中包含character代表'2'

替代做法:

如果修改YOUT int阵列来存储数字0-9char表示的十进制值,那么你就需要添加一个'0',像

int numbers[] = {'1', '2', '3', '4', '5'}; 

name[1] = numbers[1]; 

会给你想要的o/p。


建议:记住,数组索引在C是基于0

#注意:请参阅此ASCII table以供参考。

+0

啊,我明白了,'2'是不可打印的。但是当我做'0'+ 2'时会发生什么,为什么这会使字符打印? – Max

+2

@Max''0''是十进制48,'2'是十进制50.希望你有联系。 –

1

在这一行:name[1] = numbers[1];,你分配一个int值到char name[1],所以在numbers[1]该int值被认为是一些字符的ASCII码,和炭存储在name[1]

当你做name[1] = '0' + numbers[1];,那么数字(2)被添加到数字0的ASCII码中,因此你得到了实际的数字。 0的ascii码是48,加2,它就是50,这是2的ASCII码。

以前,如果您只分配了name[1] = numbers[1];,而没有0,则会打印ASCII码为0的字符。由于它不是一个适当的可打印字符,因此没有任何显示(在我的机器中显示为一些奇怪的表情符号)。

相关问题