我将以下内容添加到我的char []
中 int index = 0;
char i = '5';
char q = '7';
char val = (i - '0') + (q - '0');
array[index] = val;
++index;
如果我在分配了值后打印出val
,则会将值打印为2
(应该如此)。但是,如果我然后打印出我的char数组,那么...... printf("%.*s\n",index,array);
没有任何打印但空白。为什么会这样?
答案 0 :(得分:1)
你没有将'0'添加回你放入数组的数字(你也没有添加NUL终止符),所以它被打印出来,因为任何字符碰巧都有值12
您正在使用的字符集(可能还有代码页)(后跟内存可能包含的其他内容,直到下一个字节恰好包含零)。
在ASCII字符集(以及Unicode等派生词)中,字符12是换页符。如果您将其送入了解懂ASCII的打印机,它可能会弹出该页面,使其在下一页打印后显示。然而,在屏幕上,通常没有多大意义,所以它通常会显示为空白(或者可能是一些特殊的角色,如笑脸或其他东西)。
答案 1 :(得分: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);
答案 2 :(得分:0)
您告诉printf
它是一个字符串,但值不是可打印的ASCII值。
答案 3 :(得分:0)
好吧,假设您打算输出值12
,这意味着您正在尝试在ASCII字符集中打印字符编号12
。该角色(http://www.asciitable.com/)是一个不可打印的角色。
(实际上同样适用于角色2
。
答案 4 :(得分:0)
您可能误将值误解为数值,并将此值误解为可打印字符。
例如,x的值为2:
char ch = 7 - 5;
...但ch是不可打印的字符2.如果您希望ch中的值可打印,则必须再次添加值'0'。
char ch = x + '0';
如果值超过9,则必须使用更复杂的算法,以便将数字转换为字符串。
答案 5 :(得分:0)
格式字符串"%.*s"
需要两个参数。第一个是int
,用于打印的最小宽度(在您的情况下为index
(零)),第二个是char*
,用于数据本身。
结论:通过打印零个字符,程序运行正常。