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

C语言中使用三元运算符为字符串变量赋值失败问题排查

问题分析与解决

你的代码里给remarks赋值的环节存在三个关键错误:

  1. 数组越界访问
    remarks[15]是访问数组的第16个元素(C语言数组索引从0开始),而你定义的remarks[15]只有0到14共15个元素,属于越界操作,会触发未定义行为。

  2. 类型完全不匹配
    "Passed"和"Failed"是字符串常量,本质是char*类型的指针,而remarks[15]是单个char类型变量,不能把指针赋值给单个字符,这是语法错误。

  3. 数组不能直接用赋值运算符赋值
    C语言中数组名是地址常量,无法直接用=赋值,要将字符串存入数组,必须使用字符串拷贝函数。


修正后的代码

需要用strcpy(或更安全的strncpy)完成字符串拷贝,同时注意平均分计算的精度问题(原代码是整数除法,会丢失小数部分,比如224/3会得到74而非74.67):

#include <stdio.h>
#include <string.h> // 必须包含该头文件才能使用strcpy

int main(void) {
    int grade1, grade2, grade3;
    double average;
    char remarks[15];

    printf("Enter Grades of each subjects:\nEnglish: ");
    scanf("%d", &grade1);
    printf("Mathematics: ");
    scanf("%d", &grade2);
    printf("Programming: ");
    scanf("%d", &grade3);

    // 强制转换为double避免整数除法丢失精度
    average = (double)(grade1 + grade2 + grade3) / 3;

    // 用三元运算符配合strcpy完成赋值
    strcpy(remarks, average > 74 ? "Passed" : "Failed");

    printf("\nAverage grade: %.2lf %s", average, remarks);
    return 0;
}

为什么直接在printf里用三元运算符能正常运行?

printf的%s格式符需要接收char*类型的指针,而三元运算符average > 74 ? "Passed" : "Failed"返回的正好是字符串常量的首地址指针,完全符合%s的要求,因此能正常输出。

内容的提问来源于stack exchange,提问作者ddp17

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:41:04