C语言中用三元运算符初始化字符串变量的输出异常问题
C语言三元运算符赋值与printf输出异常问题解决
问题描述
编写的C语言代码通过三元运算符为const char*变量赋值,运行测试用例输入"swimmeet 1 1 1 1"时输出乱码(d/P/@/),预期输出为A/B/C/D,更换char数组后问题仍存在。原代码片段:
const char* trial_1; const char* trial_2; const char* trial_3; trial_1 = (pref_A != pref_B) ? "AB" : ((pref_A != pref_C)? "AC" : "AD" ) ; trial_2 = (pref_B == pref_C) ? B : ((pref_B == pref_D) ? B : C); trial_3 = (pref_B == pref_C) ? C : ((pref_B == pref_D) ? D : D); printf("%s/%s/%s", &trial_1, &trial_2, &trial_3);
问题原因
- printf参数类型不匹配:
%s格式符要求传入char*类型的字符串首地址,但代码中传入的是&trial_1(char**类型,即指针的内存地址),导致程序将指针自身的内存内容当作字符串起始位置,输出乱码。 - trial_1逻辑不符合预期:当所有
pref值相等时,pref_A != pref_B和pref_A != pref_C均为假,trial_1被赋值为"AD",与预期的"A"不符。 - B/C/D类型错误:若
B/C/D是单个char类型变量,直接赋值给const char*会将字符的ASCII值当作内存地址,访问非法内存引发报错或乱码。
解决方案
- 修正printf参数:去掉变量前的
&,直接传递trial_1、trial_2、trial_3,它们本身就是指向字符串的指针,符合%s的要求。 - 调整trial_1的逻辑:修改三元表达式,确保所有
pref相等时返回"A":trial_1 = (pref_A != pref_B) ? "AB" : ((pref_A != pref_C) ? "AC" : "A"); - 统一B/C/D的类型:将
B/C/D定义为字符串常量指针,而非单个字符:const char* B = "B"; const char* C = "C"; const char* D = "D"; - 若使用char数组:需用
strcpy函数赋值(数组名是常量指针,无法直接赋值),记得包含<string.h>头文件:char trial_2[2]; strcpy(trial_2, (pref_B == pref_C) ? "B" : ((pref_B == pref_D) ? "B" : "C"));
修正后的完整示例代码
#include <stdio.h> int main() { int pref_A = 1, pref_B = 1, pref_C = 1, pref_D = 1; const char* trial_1; const char* trial_2; const char* trial_3; const char* B = "B"; const char* C = "C"; const char* D = "D"; trial_1 = (pref_A != pref_B) ? "AB" : ((pref_A != pref_C) ? "AC" : "A"); trial_2 = (pref_B == pref_C) ? B : ((pref_B == pref_D) ? B : C); trial_3 = (pref_B == pref_C) ? C : ((pref_B == pref_D) ? D : D); printf("%s/%s/%s/D\n", trial_1, trial_2, trial_3); return 0; }
内容的提问来源于stack exchange,提问作者user23569449
相关产品推荐
相关产品推荐

