0

我正在学习 C 编程语言。我正在用 C 编程语言做作业。但我遇到了一个问题。结果不打印。我正在使用格式说明符 %s。下面是我的代码。请看一看。

#include <stdio.h>

int gradeCalculation(int marks) {
  switch (marks) {
    case 0 ... 49:
      return 'F';
      break;
    
    case 50 ... 59:
      return 'D';
      break;

    case 60 ... 69:
      return 'C';
      break;

    case 70 ... 79:
      return 'B';
      break;

    case 80 ... 89:
      return 'A';
      break;

    case 90 ... 100:
      return 'A+';
      break;

    default:
      return 'Marks is not valid!';
  }
}

int main() {
  int marks;

  printf("Marks: ");
  scanf("%d", &marks);

  printf("Grade: %s\n", gradeCalculation(marks));

  return 0;
}

如何解决我的问题?我应该使用什么说明符来获得预期的结果?

4

3 回答 3

1

对于像这样的初学者案例标签

case 90 ... 100:

不是标准的 C 功能。最好使用 if-else 语句。例如,函数参数应该具有无符号整数类型unsigned int

您的函数返回类型的对象int

int gradeCalculation(int marks) {

因此,将转换说明符%s与该类型的对象一起使用会int导致未定义的行为。

函数返回类型应该是const char *

const char * gradeCalculation( unsigned int marks ) {

而不是整数字符文字,您需要返回字符串文字,例如

case 80 ... 89:
  return "A";
  break;

case 90 ... 100:
  return "A+";
  break;

default:
  return "Marks is not valid!";

您的程序可以如下所示

#include <stdio.h>

const char * gradeCalculation( unsigned int marks ) 
{
    const char *grade = "Marks is not valid!";

    if ( marks < 50 )
    {
        grade = "F";
    }
    else if ( marks < 60 )
    {
        grade = "D";
    }
    else if ( marks < 70 )
    {
        grade = "C";
    }
    else if ( marks < 80 )
    {
        grade = "B";
    }
    else if ( marks < 90 )
    {
        grade = "A";
    }
    else if ( marks <= 100 )
    {
        grade = "A+";
    }

    return grade;
}

int main( void ) 
{
    unsigned int marks = 0;

    printf("Marks: ");
    scanf( "%u", &marks );

    printf( "Grade: %s\n", gradeCalculation( marks ) );

    return 0;
}

.

于 2021-10-03T14:24:19.907 回答
1

撇号表示字符常量;F是一个整数,它是字符“F”的代码。

由于各种遗留/历史原因,您可以使用多字符常量,例如A+,它的值可以结合两个字符“A”和“+”的值。但是,结果仍然是int; 它通常不被视为两个字符的字符串。多字符常量用于特殊目的并且依赖于实现。在特殊情况之外,您应该避免使用它们。

gradeCalculation中,您要返回一串字符。要引用字符串,我们通常使用指向其第一个元素的指针。所以将返回类型设为gradeCalculation const char *. 然后将所有字符常量更改为字符串文字,例如"F","A+""Marks is not valid". 注意使用引号而不是撇号。字符串字面量表示一个字符数组,包括一个用于标记结束的空字符。

于 2021-10-03T14:25:04.367 回答
1

您给定的代码中有几点需要注意:

  1. 在该行printf("Grade: %s\n", gradeCalculation(marks));中,该函数gradeCalculation()返回一个int,而格式说明符是%s用于字符串(char *)。

  2. 在 中int gradeCalculation(int marks),所有情况都返回一个字符,除了

    case 90 ... 100:

    return 'A+';

    break;

    default:

    return 'Marks is not valid!';

这是返回字符串。

因此,最好将所有转换为字符串并将返回类型更改为char *,即字符串。

以下是解决方案:-

#include <stdio.h>

char * gradeCalculation(int marks) {
  switch (marks) {
    case 0 ... 49:
      return "F";
      break;
    
    case 50 ... 59:
      return "D";
      break;

    case 60 ... 69:
      return "C";
      break;

    case 70 ... 79:
      return "B";
      break;

    case 80 ... 89:
      return "A";
      break;

    case 90 ... 100:
      return "A+";
      break;

    default:
      return "Marks is not valid!";
  }
}

int main() {
  int marks;

  printf("Marks: ");
  scanf("%d", &marks);

  printf("Grade: %s\n", gradeCalculation(marks));

  return 0;
}
于 2021-10-03T14:37:15.627 回答