我希望结果打印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

我希望结果是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 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,但我可能错了)。