我正在尝试根据学生总分来分配一个字母等级。然后尝试打印该字母等级,但我打印的是null。这是我正在使用的代码:
int FinalScore;
FinalScore = q1w+q2w+q3w+q4w+midiw+midiiw+finalw;
// Determine the letter Grade
if (FinalScore>=0 && FinalScore <= 59)
{
char LetterGrade[20];
strcpy(LetterGrade,"F");
}
if(FinalScore>=60 && FinalScore <=69)
{
char LetterGrade[20];
strcpy(LetterGrade,"D");
}
if(FinalScore>=70 && FinalScore <=79)
{
char LetterGrade[20];
strcpy(LetterGrade,"C");
}
if(FinalScore>=80 && FinalScore <=89)
{
char LetterGrade[20];
strcpy(LetterGrade,"B");
}
if(FinalScore>=90 )
{
char LetterGrade[20];
strcpy(LetterGrade,"A");
}
printf("%s",&LetterGrade);
为什么我得到null的任何想法?感谢。
答案 0 :(得分:3)
LetterGrade的定义范围与您尝试使用它的范围不同。
删除char LetterGrade[20];
的每个实例,并将其移到if语句的上方。
Finalscore = . . .
char LetterGrade[20];
if (. . .
此外,我建议您使用char
,不知道为什么您首先使用char[]
来存储一个字符。
答案 1 :(得分:3)
在您对LetterGrade的所有定义中,您已在if块中声明了该变量。因此,它不存在于任何这些块之外,并且当您打印时,您正在尝试打印不存在的内容。 (即超出范围)
答案 2 :(得分:3)
我没有看到创建字符串(char[20]
)的任何效用,而不是简单的char
,因为它最终只会有一个字符。我写了code似乎工作正常。
您的代码的问题是LetterGrade
在if
的范围内声明,因此,当您尝试打印它时,它已经超出范围,正如我在上面提到的那样我的评论。
非常重要!正如@Jite在评论中提到的,请注意%c
中的%s
格式说明符,而不是printf
。
我希望这符合您的需求。
#include <stdio.h>
int main()
{
int FinalScore = 60;
char LetterGrade;
// Determine the letter Grade
if(FinalScore>=0 && FinalScore <= 59) LetterGrade = 'F';
else if(FinalScore>=60 && FinalScore <=69) LetterGrade = 'D';
else if(FinalScore>=70 && FinalScore <=79) LetterGrade = 'C';
else if(FinalScore>=80 && FinalScore <=89) LetterGrade = 'B';
else LetterGrade = 'A';
printf("%c", LetterGrade);
return 0;
}
答案 3 :(得分:2)
当您在Lettergrade
中声明if
时,它if
是本地的,并且未在外部定义。
由于您只想打印一个字母,因此不需要char
数组。一个简单的char
变量就足够了。
答案 4 :(得分:2)
那里有几个问题。 您正在if语句的范围内定义LetterGrade,这意味着它们在您进入printf语句时将超出现代C编译器IIRC的范围。 此外,您的print语句将尝试将&amp; LetterGrade解释为指向字符的指针,而实际上它是指向char数组的指针,它更像是指向char的指针。试试printf(&#34;%s&#34;,LetterGrade)。
答案 5 :(得分:2)
您无需指定&amp;同时显示字符串。
您已在不同的范围内声明了LetterGrade。当你在块内声明和修改相同的东西时,全局范围的LetterGrade值不会改变。它获得了块范围。 因此,删除块内的所有LetterGrade声明。全球性就足够了 scope-rules-in-c
要显示等级,为什么不能使用char而不是char数组或字符串。
答案 6 :(得分:2)
尝试:
int FinalScore;
char LetterGrade;
FinalScore = q1w+q2w+q3w+q4w+midiw+midiiw+finalw;
if (FinalScore>=0 && FinalScore <= 59)
{
LetterGrade = 'F';
}
if(FinalScore>=60 && FinalScore <=69)
{
LetterGrade = 'D';
}
if(FinalScore>=70 && FinalScore <=79)
{
LetterGrade = 'C';
}
if(FinalScore>=80 && FinalScore <=89)
{
LetterGrade = 'B';
}
if(FinalScore>=90 )
{
LetterGrade = 'A';
}
printf("%c", LetterGrade);
答案 7 :(得分:1)
在比较之前,将最终得分除以10,可以减少比较次数:
#include <stdio.h>
int main(void)
{
int FinalScore = ...;
char LetterGrade;
FinalScore /= 10;
// Determine the letter Grade
if (FinalScore < 5) LetterGrade = 'F';
else if (FinalScore < 7) LetterGrade = 'D';
else if (FinalScore < 8) LetterGrade = 'C';
else if (FinalScore < 9) LetterGrade = 'B';
else LetterGrade = 'A';
printf("%c\n", LetterGrade);
return 0;
}
在性能方面更有效率的是地图:
#include <stdio.h>
const char ScoreToGradeMap[10] = {'F', 'F', 'F', 'F', 'F', 'D', 'D', 'C', 'B', 'A'};
int main(void)
{
int FinalScore = ...;
char LetterGrade;
FinalScore /= 10;
if (0 > FinalScore) FinalScore = 0;
else if (9 < FinalScore) FinalScore = 9;
LetterGrade = ScoreToGradeMap[FinalScore];
printf("%c\n", LetterGrade);
return 0;
}
答案 8 :(得分:0)
发布的代码显示出两个主要问题。
1) the character array 'LetterGrade' is only visible within the code block where it is defined.
Suggest defining once, before all the testing of the students score
2a) LetterGrade is not visible at the printf() statement, so the code will not compile
2b) when calling printf() do not pass the address of LetterGrade
suggest: printf("%s", LetterGrade);