在C语言中对字符串使用三元算子



尝试使用三元运算符根据平均等级将字符串分配给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中的阵列是基于零的,因此阵列索引的范围从014——尝试写入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
    


  1. strncpymemcpy,或类似物

使用

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

相关内容

  • 没有找到相关文章

最新更新