如果我尝试使用%c和%s打印大整数怎么办?

如果我尝试使用%c和%s打印大整数怎么办?,c,string,character,C,String,Character,如果我尝试打印C中给出的1000: printf("%c\n",1000); printf("%s\n",1000); 输出是什么?或者两行都有错误?请参阅printf格式说明符: %c-用于打印字符(char),该字符的值通常在-128到127之间(也可以是0到255) %s-用于打印字符的数组,最后一个字符为NULL(\0) 所以printf(“%c\n”,1000)显示实现定义的行为,即1000大于128(或255) 和printf(“%s\n”,1000)正在尝试打印地址1000处的字

如果我尝试打印C中给出的1000:

printf("%c\n",1000);
printf("%s\n",1000);

输出是什么?或者两行都有错误?

请参阅printf格式说明符:

%c
-用于打印字符(
char
),该字符的值通常在-128到127之间(也可以是0到255)

%s
-用于打印
字符的数组,最后一个字符为
NULL
\0

所以
printf(“%c\n”,1000)显示实现定义的行为,即1000大于128(或255)

printf(“%s\n”,1000)
正在尝试打印地址1000处的字符数组(很可能是错误的)。这也是未定义的行为,因此任何事情都可能发生

如果要打印整数,应使用
%d
,如下所示:

printf("%d\n",1000);
%c
需要类型为
int
(到目前为止,还不错)的参数,并将其打印为字符。1000(几乎可以肯定)超出了
char
无符号char
的范围,但是

如果不存在
l
长度修饰符,则转换
int
参数 写入一个
无符号字符
,并写入结果字符

转换为无符号整数类型定义良好;它是减少模
UCHAR\u MAX+1
。假设
UCHAR\u MAX==255
(几乎可以肯定是这样),转换的结果是
(无符号字符)232
,因此它将(尝试)打印字符232。结果可能取决于区域设置。您可能会遇到232(0xe8)作为无效UTF-8编码的问题

printf("%s\n",1000);

%s
需要类型为
char*
的参数。因此,行为是未定义的。(实际上可能发生的情况是,值
1000
被视为指针。这不太可能是一个有效地址,或者有一个有效字符串从该地址开始。)

使用错误的printf格式说明符会调用未定义的行为错误,这意味着任何事情都可能发生。思考你为什么会有某种未定义的行为,不会给你多少有意义的知识,但无论如何

如果是
printf(“%s\n”,1000)
您只需对编译器撒谎,告诉它
1000
是指向已分配字符串的指针。很难说到底会发生什么-可能编译器会运行到地址1000并试图访问它,可能会导致崩溃

如果是
printf(“%c\n”,1000)char
,它将被提升为
int
,然后转换回
char

但是您传递的是整数常量
1000
,它的类型是
int
。恰巧,
printf
在隐式升级后需要一个
int
,它将尝试将
1000
“返回”转换为
char
。这意味着编译器将获取
int
的最低有效字节,并将其视为
char
(或者挑剔,视为
无符号char


1000
=
0x000003E8
char
转换将获取最低有效
E8
字节。然后打印该字符在符号表中表示的任何内容(如果有的话)。

为什么不运行代码看看会发生什么?@B001ᛦ 它显示了分段fault@B001ᛦ: 在一个C实现上尝试代码只会显示一个C实现在测试的特定环境中所做的事情。它没有解释C标准定义的语义或其他规则。
printf(“%C\n”,1000)没有未定义的行为。
int
参数被转换为
无符号字符
。“看看我的答案。”基思·汤普森同意。我最好说它是由实现定义的。而且,
char
的范围不一定是0-255。在桌面系统上,-128到127是最常见的。@Lundin是的。这就是为什么我说“正常”。我相应地修正了答案。@Lundin:plain
char
的符号性在这种情况下是不相关的。该标准特别指出,
int
参数被转换为
无符号字符
,其范围为0..255,除非您使用的是
char\u BIT>8
的特殊系统(很可能是DSP)。此外,到无符号类型的范围外整数转换是定义良好的,这与到有符号类型的范围外整数转换不同。我不认为这种行为是未定义的。它完全按照你说的做,它尝试访问地址1000。我认为这很好defined@RoQuOTriX如果是
printf(“%s\n”,1000)如果指针是64位的,而
int
是32位的,则只会将4个字节推送到堆栈上。但是,
printf
函数希望找到一个8字节的指针,而其他4字节的内容未知。@如果使用了错误的格式说明符,则该行为未定义。请参阅@ericspostpischil Fixed。我没有详细检查printf关于
%c
的说法,它确实说存在从
int
无符号字符的隐式转换。在这种情况下,持久性并不重要。
printf("%s\n",1000);