【问题标题】:char c[]="Albus"; printf("%c", c); [closed]char c[]="阿不思"; printf("%c", c); [关闭]
【发布时间】: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


    【解决方案1】:

    关于 的一些事实你不知道:

    1. 没有string 数据类型。字符串只是以0 字节结尾的char 序列。您在这里使用的是字符串 literal——编译器将其转换为 char 的数组,并在末尾自动添加 0

    2. 数组在传递给函数时会自动转换为指向其第一个元素的指针,因此您的printf() 会得到char * 类型的参数。

    考虑到这一点,您的代码只是未定义的行为:您的格式字符串 (%c) 告诉 printf() 期待一个 char,但它被赋予了一个 char * 而不是一个完全不同的类型,并且通常具有不同的大小(例如,典型 i386 机器上的 4 个字节)。

    在实践中可能发生的是printf() 将显示char 数组地址的最低有效字节,解释为ASCII 字符。它看起来很随机。但它也可能只是崩溃或做任何其他事情,它是未定义的......


    对于初学者,请始终在启用所有编译器警告的情况下编译您的 代码。然后,您将收到有关大多数可能未定义或由于其他原因而危险的警告。如果您不理解警告,请使用 Google 搜索。

    如果您使用gcc,则使用方法是gcc -Wall -Wextra -pedantic

    【讨论】:

    • "printf() 将显示 char 数组地址的最低有效字节,解释为 ASCII 字符" -- 这不取决于字节序吗?和酷答案! +1
    • @CoolGuy 我不这么认为,因为char 也会作为int 传递......但当然不能保证 UB 会发生任何特别的事情,试图说清楚;)
    • 对于记录,c 不是字符串文字,而是char 的数组。
    • @JensGustedt 并使用字符串文字初始化。你会如何清楚地表达出来?
    猜你喜欢
    • 2022-01-22
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多