尝试使用三元运算符根据平均等级将字符串分配给remarks
变量。但是remark
没有被正确分配。
#include <stdio.h>
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);
average = (grade1 + grade2 + grade3) / 3;
remarks[15] = (average > 74) ? "Passed":"Failed";
printf("nAverage grade: %.2lf %s", average, remarks);
该程序打算获得3个数字(等级(的平均值,然后根据结果宣布通过或不通过。
该程序正确地获得了输入,但唯一打印出来的是平均值。
当我修改代码并这样写时,它运行得很好。
printf("nAverage grade: %.2lf %s", average, average > 74 ? "Passed" : "Failed");
我认为问题在于在获得所有分数后重新分配可变备注。
EDIT:在第一个printf
语句中添加了占位符%s。
您正在将const char *
分配给char
(remarks[15]
(。该索引超出了界限,因为C数组的索引从0
开始,而对于15元素的数组,则转到14
。
请使用以下内容,它只是将注释存储为指向正确字符串文字(const char *
(的指针。
char *remarks = (average > 74) ? "Passed" : "Failed";
两个问题:
-
您试图将字符串分配给单个数组元素
remarks[15]
,而不是整个数组。此外,由于C中的阵列是基于零的,因此阵列索引的范围从0
到14
——尝试写入remarks[15]
将写入阵列外的存储器。 -
不能使用
=
来分配数组内容、字符串或其他内容。必须使用strcpy
库函数1,如strcpy( remarks, average > 74 ? "Passed" : "Failed" )
。或者,您必须分配单独的阵列元素:remarks[0] = average > 74 ? 'P' : 'F'; remarks[1] = 'a'; remarks[2] = average > 74 ? 's' : 'i'; remarks[3] = average > 74 ? 's' : 'l'; remarks[4] = 'e'; remarks[5] = 'd'; remarks[6] = 0; // terminate the string
- 或
strncpy
或memcpy
,或类似物
使用
const char* remarks;
remarks = (average > 74) ? "Passed":"Failed";
printf("nAverage grade: %.2lf", average, remarks);
或
char remarks[15];
strcpy( remarks, (average>74) ? "Passed" : "Failed" );
printf( "nAverage grade: %.2lf", average, remarks);
它们是不同的。在第一种情况下,remarks
是指针,在第二种情况下remarks
是字符数组。
如果您想知道char指针和const组合之间的区别,请查看本文。
注意这是C++特有的,因为C允许其中一些:
Godbolt链接:https://godbolt.org/z/rz6bh4qzP
指向可写位置的可写指针
char* a1; // ok
char* a2 = nullptr; // ok
char* a3 = "Hello"; // error: ISO C++ forbids converting a string constant to 'char*'
a1 = nullptr; // ok
a1 = "Hello"; // error: ISO C++ forbids converting a string constant to 'char*'
a1[0] = 'x'; // ok
指向常量位置的可写指针
const char* b1; // ok
const char* b2 = nullptr; // ok
const char* b3 = "Hello"; // ok
b1 = nullptr; // ok
b1 = "Hello"; // ok
b1[0] = 'x'; // error: assignment of read-only location
指向可写位置的Const指针
char * const c1; // error: uninitialized const
char * const c2 = nullptr; // ok
char * const c3 = "Hello"; // error: ISO C++ forbids converting a string constant to 'char*'
c1 = nullptr; // error: assignment of read-only variable
c1 = "Hello"; // error: assignment of read-only variable
c1[0] = 'x'; // ok
指向常量位置的常量指针
const char * const f1; // error: uninitialized 'const f1'
const char * const f2 = nullptr; // ok
const char * const f3 = "Hello"; // ok
f1 = nullptr; // error: assignment of read-only variable
f1 = "Hello"; // error: assignment of read-only variable
f1[0] = 'x'; // error: assignment of read-only location