2011-11-14 68 views
0

我添加如果我打印出val一旦值已被分配它打印出的值作为2(因为它应该)以下我的char []Char []值没有被打印?

int index = 0; 
char i = '5'; 
char q = '7'; 
char val = (i - '0') + (q - '0'); 
array[index] = val; 
++index; 

。但是,如果我然后打印出像我这样的字符数组。printf("%.*s\n",index,array);没有打印,但空的空间。这是为什么发生?

+0

这是怎样的问题,如果你扩大你的代码,一个完整的计划,我们可以只复制和粘贴,以编译和运行, – hugomg

+0

,这将大大受益?我使val为0x12 - 换页符。 –

+0

@MartinJames不是'0x12'而是十进制'12'。 –

回答

0

您正在告诉printf它是一个字符串,但值不是可打印的ASCII值。

1

您还没有将“0”加回到您放入数组中的数字(您也没有添加NUL终止符),因此它将被打印出来,因为无论字符在字符集中碰巧具有值12(可能还有代码页)(之后是内存可能包含的任何其他内容,直到下一个恰好包含零的字节)。

在ASCII字符集(以及Unicode等派生词)中,字符12是一个换页字符。如果您将其送入了理解ASCII的打印机,那么它可能会在下一页打印之后弹出该页面以显示文本。然而,在屏幕上,通常没什么意义,所以它通常会显示为空白(或者可能是一些特殊字符,如笑脸或其他东西)。

0

好吧,假设你的意思是打印出12的值,这意味着你试图在ASCII字符集中打印字符号12。该字符(http://www.asciitable.com/)是不可打印的字符。

(实际上也是字符2)。

0

您可能误解为数值的值,并将此值视为可打印的字符。

例如,x的值2:

char ch = 7 - 5; 

...但CH是非打印字符2.如果你想在CH值可打印,则必须再次添加它值为'0'。

char ch = x + '0'; 

如果值超过9,则必须使用更复杂的算法,以便将数字转换为字符串。

0

格式字符串"%.*s"需要两个参数。第一个是int,用于打印的最小宽度(在您的情况下为index(零)),第二个为数据本身的char*

结论:通过打印零字符,程序的行为正确。

1

每个ASCII字符都有一个整数值。打印字符时,下层系统检查变量值char并打印相应的ASCII字符。值本身不打印。请参阅ASCII table以供参考。

char var = '7'; // var's value is actually 55. 
char other = 55; // This is same as '7' 

当计算两个数字字符的总和,你的情况“5”和“7”,你必须减去字符“0”,从他们皈依“5”和“7”,以数字5和7。

char first = '5' - '0'; // Is actually 53 - 48 = 5 
char second = '7' - '0'; // Is actually 55 - 48 = 7 
char result = first + second; // 5 + 7 = 12 

// When you print result, you will not see "12" printed. Instead you see a form feed special character. 

char test = '5' + '7'; // 53 + 55 = 108, which is letter 'l' 

你要的char值转换为字符串打印的实际值。你可以用itoa()转换。

char result = ('5' - '0') + ('7' - '0'); 
char buf[5]; 
memset(buf, 0, sizeof(buf)); 

itoa((int)result, buf, 10); 
printf("%s\n", buf);