人物& Printf中的字符串

时间:2016-06-08 22:16:28

标签: c

我正在阅读关于C的练习册并且发现了声明

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

在控制台中运行时仍然有效但显示“$”符号。

为什么这句话没有像

那样使控制台崩溃
printf("%s", '\n'); 

确实

5 个答案:

答案 0 :(得分:3)

双引号字符串会生成指向char(又名char*)的指针值,而单引号会生成一个字符值(使用ASCII值为什么)在引号中。在某些编译器中,您可以将多个字符堆叠到单引号中。

printf("%c", *("\n") );

会打印您的换行符,因为*运算符会取消引用指针

(你可能会做*"\n",我只是在编写表达式时保守一些)

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

崩溃,因为%s需要一个指针,并且一个指针的换行符指向杂草,很可能导致无效的内存访问

答案 1 :(得分:3)

它将通过传递具有错误类型的数据来调用未定义的行为。它只是发生而不是崩溃。

在某些实现中,从字符串文字转换的指针作为参数传递。与%s不同,%c将参数解释为指针并转到读取,{{1}}只会将参数作为数字并打印出来,因此崩溃的机会较少。

答案 2 :(得分:2)

因为%s需要NUL终止字符串,其中%c只需要一个字符。字符串将读取缓冲区的末尾(单个字符),查找NUL,很可能导致内存异常。或不 - 因此未定义的行为。

答案 3 :(得分:0)

只有后一个语句要求实现取消引用无效指针。无效值通常显示为垃圾。但是大多数可能的内存位置值都是不可访问的,尝试访问它们会导致现代操作系统崩溃。

答案 4 :(得分:0)

%s打印,直到达到' \ 0'因为\ n没有转义它将读入内存。 "%C"只需要一个字符