我希望结果打印ac[0],但它会给我一个问号,如图所示。我可以如何更正它?
我希望结果是ac[0]的值,但它显示了一些令人困惑的东西。第二行可以工作我希望结果打印ac[0],但它会给我一个问号,如图所示。我可以如何更正它?,c,C,我希望结果是ac[0]的值,但它显示了一些令人困惑的东西。第二行可以工作 #include <stdio.h> int main(void){ char a='a'; char b='b'; char ac[]={-24,1,2,3,4,5,6,7,8,9,}; char *p=ac; printf("*p=%c ",*p);//this is the par
#include <stdio.h>
int main(void){
char a='a';
char b='b';
char ac[]={-24,1,2,3,4,5,6,7,8,9,};
char *p=ac;
printf("*p=%c ",*p);//this is the part that produces problem
printf("*p=%d ",*p);//this works
//! *(p+n)<--->ac[n]
}
#包括
内部主(空){
字符a='a';
字符b='b';
字符ac[]={-24,1,2,3,4,5,6,7,8,9,};
char*p=ac;
printf(“*p=%c”,*p);//这是产生问题的部分
printf(“*p=%d”,*p);//这很有效
//!*(p+n)ac[n]
}
0到31之间的ASCII字符不可打印<代码>-24也不是有效的ASCII代码。因此,printf()
尝试将-24
(无效的代码,因为它被转换为无符号字符
类型,以后不能为负数)转换为字符,因为此处使用了%c
,但它会自动失败。这就是为什么你会得到一个未知的符号
例如,将
65
放在-24%c
的位置后,您将看到字母A
,它打印由字符
整数值保持的整数编码的字符
最流行的7位系统是ASCII:
(在0x7f以上,它们不是标准的)。请忽略其他不相关的输出…我删除了一些代码您无法在%c
中打印*p
(char*
)。这会误导输出。如果要打印ac[n]
,则必须将ac[n]
传递到printf
。此外,ASCII中的前31个字符是不可打印的。你在这里该做什么?——也许您希望定义int ac[]={…}
%c
将其参数转换为无符号字符,并输出结果。通常,这意味着-24将向控制台输出字节232。控制台上的特定输出将取决于它的配置方式(即:希望程序使用的字符编码)。可能它预期的是utf-8,所以得到“?”表示格式错误的utf-8序列。通过管道将程序的输出传输到od-c
中,将准确显示正在生成的字节。标准中指定了int到无符号字符的转换(-24将转换为232,假设为8位字符)。没有故障——字符232将被输出到标准输出。字符编码(例如:ASCII)在这里除了控制台如何显示结果之外没有任何作用(我认为现在大多数控制台没有配置为使用ASCII,但我可能错了)。