C语言报错E0144如何解决?怎样编写代码实现输出字符'f'的需求
问题原因解释与正确实现
1. 第一段代码报错E0144的原因
C语言中单引号包裹的内容是char类型的字符常量,双引号包裹的内容是字符串字面量,字符串字面量的本质是末尾隐含了\0结束符的字符数组,类型为const char[N](N为字符数+1),使用时会自动隐式转换为指向首字符的const char*指针。
你第一段代码中尝试把类型为const char*的字符串"f"赋值给char类型的变量first_ch,二者类型完全不匹配,所以编译器抛出E0144错误(该错误的完整提示为:const char* 类型的值不能用于初始化 char 类型的实体)。
2. 第二段代码输出0的原因
你修改后将first_ch定义为const char*指针,类型匹配所以不再报错,但printf的格式符和传入参数类型不匹配:
%c格式符要求传入的参数是int类型(char类型传参时会自动提升为int),对应要输出的字符的ASCII值- 你实际传入的是
const char*类型的指针,也就是字符串"f"的内存首地址,属于未定义行为
你看到输出0是当前运行环境下的偶然结果:printf会把传入的指针值的最低1个字节当作字符的ASCII值处理,刚好这个地址的最低字节为0,对应ASCII的空字符,所以输出看起来是0。不同编译环境、运行环境下可能得到完全不同的结果。
3. 正确实现代码
方式1:直接使用char类型变量(最符合需求的写法)
#include <stdio.h> int main() { // 用单引号包裹得到char类型的字符'f' char first_ch = 'f'; printf("%c", first_ch); return 0; }
方式2:如果要使用字符串指针,需要匹配格式符/解引用
#include <stdio.h> int main() { const char* first_ch = "f"; // 方法A:解引用指针拿到首字符,匹配%c printf("%c", *first_ch); // 方法B:用%s格式符输出字符串,也会得到字符f // printf("%s", first_ch); return 0; }
内容的提问来源于stack exchange,提问作者DacaDa Apasati-TastAunu
相关产品推荐
相关产品推荐

