C语言中使用三元运算符为字符串变量赋值失败问题排查
问题分析与解决
你的代码里给remarks赋值的环节存在三个关键错误:
数组越界访问
remarks[15]是访问数组的第16个元素(C语言数组索引从0开始),而你定义的remarks[15]只有0到14共15个元素,属于越界操作,会触发未定义行为。类型完全不匹配
"Passed"和"Failed"是字符串常量,本质是char*类型的指针,而remarks[15]是单个char类型变量,不能把指针赋值给单个字符,这是语法错误。数组不能直接用赋值运算符赋值
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
相关产品推荐
相关产品推荐

