用C语言指定字母

用C语言指定字母,c,string,printf,C,String,Printf,我正试着根据学生的总分来分配一个字母等级。然后尝试打印字母等级,但我打印的是空值。以下是我正在使用的代码: int FinalScore; FinalScore = q1w+q2w+q3w+q4w+midiw+midiiw+finalw; // Determine the letter Grade if (FinalScore>=0 && FinalScore <= 59) { char LetterGrade[20]; strcpy(

我正试着根据学生的总分来分配一个字母等级。然后尝试打印字母等级,但我打印的是空值。以下是我正在使用的代码:

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);
int FinalScore;
最终核心=q1w+q2w+q3w+q4w+midiw+midiw+finalw;
//确定字母等级
如果(FinalScore>=0&&FinalScore=60&&FinalScore=70&&FinalScore=80&&FinalScore=90)
{
煤焦等级[20];
strcpy(字母等级“A”);
}
printf(“%s”、&LetterGrade);

知道我为什么会得到空值吗??谢谢。

LetterGrade的定义范围与您试图使用它的范围不同


删除
char LetterGrade[20]的每个实例
并将其移动到if语句的正上方

Finalscore = . . .
char LetterGrade[20];
if (. . .

此外,我建议只使用
char
,不确定为什么要首先使用
char[]
来存储一个字符。

当您在
if
中声明
Lettergrade
时,它是该
if
的本地属性,并且不在外部定义


由于您只想打印一个字母,因此不需要字符数组。一个简单的
char
变量就足够了。

在您所有的LetterGrade定义中,您已经在if块中声明了该变量。因此,它不存在于这些块之外,当您打印时,您正试图打印不存在的内容。(即超出范围)

有几个问题。 您在if语句的范围内定义了LetterGrade,这意味着当您在printf语句中定义时,它们将超出现代C编译器IIRC的范围。
另外,您的print语句将尝试将&LetterGrade解释为指向字符的指针,而实际上它是指向char数组的指针,更像是指向char的指针。请尝试使用printf(“%s”,LetterGrade)。

在显示字符串时,无需指定(&p>)

您已在不同范围内声明了LetterGrade。在块内声明和修改相同内容时,全局范围LetterGrade值不会更改。它得到块范围。 因此,删除块内的所有LetterGrade声明。全球性的就足够了。

为了只显示等级,为什么不能使用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);
int FinalScore;
煤焦等级;
最终核心=q1w+q2w+q3w+q4w+midiw+midiw+finalw;
如果(FinalScore>=0&&FinalScore=60&&FinalScore=70&&FinalScore=80&&FinalScore=90)
{
字母等级='A';
}
printf(“%c”,字母等级);

我看不到任何创建字符串(
char[20]
)的实用程序,而不是简单的
char
,因为它最后只有一个字符。我写了一本似乎很好用的书

您的代码的问题是
LetterGrade
if
的范围内声明,因此,当您尝试打印它时,它已经超出了范围,正如我在评论中提到的那样

非常重要正如@Jite在他的评论中提到的,请注意
printf
中的
%c
格式说明符而不是
%s

我希望这符合你的需要

#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;
}
#包括
int main()
{
int FinalScore=60;
煤焦等级;
//确定字母等级

如果(FinalScore>=0&&FinalScore=60&&FinalScore=70&&FinalScore=80&&FinalScore比较前,可通过将最终分数除以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;
}
#包括
内部主(空)
{
int FinalScore=。。。;
煤焦等级;
最终核心/=10;
//确定字母等级
如果(最终分数<5)字母等级='F';
否则,如果(最终核心<7)LetterGrade='D';
否则,如果(最终核心<8)LetterGrade='C';
否则,如果(最终分数<9)LetterGrade='B';
else LetterGrade='A';
printf(“%c\n”,字母等级);
返回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;
}
#包括
const char ScoreToGradeMap[10]={'F','F','F','F','F','D','D','C','B','A'};
内部主(空)
{
int FinalScore=。。。;
煤焦等级;
最终核心/=10;
如果(0>FinalScore)FinalScore=0;
如果(9
发布的代码显示了两个主要问题

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);

您在哪里定义了
LetterGrade
?它不是由“char-LetterGrade[20]”定义的吗?您可以使用
char-LetterGrade
,然后
LetterGrade='A'
char-LetterGrade[20];
在尝试
printf(“%s”,&LetterGrade)时已超出范围)问题是当代码离开时,如果(FinalScore>=80&&FinalScore这是一样的,它将被忽略。请注意使用
%c
而不是
%s
作为
printf
的格式说明符!非常重要,因为如果
LetterGrade
类型为
char
并像上面那样使用,那么就没有NUL终止…类似于,@alk在你给出的版本中,比较数量的变化不是因为除以10。这是因为你改变了测试的性质。如果两个等级之间的边界不是10的倍数,你的方法也将不起作用(例如,如果C和D等级之间的边界是65而不是70),这在实践中确实经常发生。