【发布时间】:2015-10-11 07:17:58
【问题描述】:
如果我们在打印字符串时尝试在printf 中使用%c 将会是什么输出。例如-
char c[]="Albus";
printf("%c", c);
或
char c[2]="A";
printf("%c", c);
【问题讨论】:
标签: c char printf format-specifiers c-strings
如果我们在打印字符串时尝试在printf 中使用%c 将会是什么输出。例如-
char c[]="Albus";
printf("%c", c);
或
char c[2]="A";
printf("%c", c);
【问题讨论】:
标签: c char printf format-specifiers c-strings
关于c 的一些事实你不知道:
没有string 数据类型。字符串只是以0 字节结尾的char 序列。您在这里使用的是字符串 literal——编译器将其转换为 char 的数组,并在末尾自动添加 0。
数组在传递给函数时会自动转换为指向其第一个元素的指针,因此您的printf() 会得到char * 类型的参数。
考虑到这一点,您的代码只是未定义的行为:您的格式字符串 (%c) 告诉 printf() 期待一个 char,但它被赋予了一个 char * 而不是一个完全不同的类型,并且通常具有不同的大小(例如,典型 i386 机器上的 4 个字节)。
在实践中可能发生的是printf() 将显示char 数组地址的最低有效字节,解释为ASCII 字符。它看起来很随机。但它也可能只是崩溃或做任何其他事情,它是未定义的......
对于初学者,请始终在启用所有编译器警告的情况下编译您的 c 代码。然后,您将收到有关大多数可能未定义或由于其他原因而危险的警告。如果您不理解警告,请使用 Google 搜索。
如果您使用gcc,则使用方法是gcc -Wall -Wextra -pedantic。
【讨论】:
printf() 将显示 char 数组地址的最低有效字节,解释为 ASCII 字符" -- 这不取决于字节序吗?和酷答案! +1
char 也会作为int 传递......但当然不能保证 UB 会发生任何特别的事情,试图说清楚;)
c 不是字符串文字,而是char 的数组。