在 C 中分配一个字母
Assigning a Letter in C
我正在尝试根据学生的总分分配字母等级。然后尝试打印该字母等级,但我打印的是空值。这是我正在使用的代码:
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);
知道为什么我得到空值吗?谢谢
LetterGrade 的定义范围与您尝试使用它的范围不同。
删除 char LetterGrade[20];
的每个实例并将其移动到 if 语句的正上方。
Finalscore = . . .
char LetterGrade[20];
if (. . .
此外,我建议只使用 char
,不确定你为什么首先使用 char[]
来存储一个字符。
当您在 if
中声明 Lettergrade
时,它是那个 if
的局部变量,而不是在外部定义的。
并且由于您只想打印一个字母,因此不需要 char
的数组。一个简单的 char
变量就足够了。
在 LetterGrade 的所有定义中,您都在 if 块中声明了变量。因此,它不存在于任何这些块之外,并且当您打印时,您正在尝试打印不存在的东西。 (即超出范围)
那里有几个问题。
您在 if 语句的范围内定义 LetterGrade,这意味着当您进入 printf 语句时,它们将超出现代 C 编译器 IIRC 的范围。
此外,您的 print 语句将尝试将 &LetterGrade 解释为指向字符的指针,而实际上它是指向字符数组的指针,更像是指向字符指针的指针。试试 printf("%s", LetterGrade).
显示字符串时不需要指定&。
您在不同的范围内声明了 LetterGrade。当您在块内声明和修改同一事物时,全局范围 LetterGrade 值不会改变。它获得块作用域。
因此,删除块内所有 LetterGrade 的声明。全球一个就够了。
scope-rules-in-c
为了只显示成绩为什么不能使用 char 而不是 char 数组或字符串。
尝试:
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);
我没有看到创建字符串 (char[20]
) 的任何实用程序,而不是简单的 char
,因为它最终将只有一个字符。我写的code好像还行。
你的代码的问题是 LetterGrade
是在 if
的范围内声明的,所以,当你尝试打印它时,它已经超出了范围,我也是在我的评论中提到。
非常重要! 正如@Jite 在他的评论中提到的那样,请注意 %c
格式说明符而不是 %s
,在 [=17] =].
希望能满足您的需求。
#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;
}
在比较之前将最终得分除以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;
}
发布的代码存在两个主要问题。
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);
我正在尝试根据学生的总分分配字母等级。然后尝试打印该字母等级,但我打印的是空值。这是我正在使用的代码:
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);
知道为什么我得到空值吗?谢谢
LetterGrade 的定义范围与您尝试使用它的范围不同。
删除 char LetterGrade[20];
的每个实例并将其移动到 if 语句的正上方。
Finalscore = . . .
char LetterGrade[20];
if (. . .
此外,我建议只使用 char
,不确定你为什么首先使用 char[]
来存储一个字符。
当您在 if
中声明 Lettergrade
时,它是那个 if
的局部变量,而不是在外部定义的。
并且由于您只想打印一个字母,因此不需要 char
的数组。一个简单的 char
变量就足够了。
在 LetterGrade 的所有定义中,您都在 if 块中声明了变量。因此,它不存在于任何这些块之外,并且当您打印时,您正在尝试打印不存在的东西。 (即超出范围)
那里有几个问题。 您在 if 语句的范围内定义 LetterGrade,这意味着当您进入 printf 语句时,它们将超出现代 C 编译器 IIRC 的范围。 此外,您的 print 语句将尝试将 &LetterGrade 解释为指向字符的指针,而实际上它是指向字符数组的指针,更像是指向字符指针的指针。试试 printf("%s", LetterGrade).
显示字符串时不需要指定&。
您在不同的范围内声明了 LetterGrade。当您在块内声明和修改同一事物时,全局范围 LetterGrade 值不会改变。它获得块作用域。
因此,删除块内所有 LetterGrade 的声明。全球一个就够了。
scope-rules-in-c
为了只显示成绩为什么不能使用 char 而不是 char 数组或字符串。
尝试:
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);
我没有看到创建字符串 (char[20]
) 的任何实用程序,而不是简单的 char
,因为它最终将只有一个字符。我写的code好像还行。
你的代码的问题是 LetterGrade
是在 if
的范围内声明的,所以,当你尝试打印它时,它已经超出了范围,我也是在我的评论中提到。
非常重要! 正如@Jite 在他的评论中提到的那样,请注意 %c
格式说明符而不是 %s
,在 [=17] =].
希望能满足您的需求。
#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;
}
在比较之前将最终得分除以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;
}
发布的代码存在两个主要问题。
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);