You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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值当作内存地址,访问非法内存引发报错或乱码。

解决方案

  1. 修正printf参数:去掉变量前的&,直接传递trial_1、trial_2、trial_3,它们本身就是指向字符串的指针,符合%s的要求。
  2. 调整trial_1的逻辑:修改三元表达式,确保所有pref相等时返回"A":
    trial_1 = (pref_A != pref_B) ? "AB" : ((pref_A != pref_C) ? "AC" : "A");
    
  3. 统一B/C/D的类型:将B/C/D定义为字符串常量指针,而非单个字符:
    const char* B = "B";
    const char* C = "C";
    const char* D = "D";
    
  4. 若使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:04:52