如果我尝试使用%c和%s打印大整数怎么办?
如果我尝试打印C中给出的1000:如果我尝试使用%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处的字
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)这实际上是一种偶然的确定性行为。变量函数(如printf)的所有参数都得到隐式提升。如果您传递了一个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:plainchar
的符号性在这种情况下是不相关的。该标准特别指出,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);