格式说明符 %s 未显示结果

Format specifier %s in not showing result

我正在学习 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;
}

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

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

case 90 ... 100:

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

你的函数return是一个int

类型的对象
int gradeCalculation(int marks) {

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

函数return类型应该是const char *

const char * gradeCalculation( unsigned int marks ) {

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

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

.

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

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

gradeCalculation中,你要return一串字符。为了引用一个字符串,我们通常使用指向它的第一个元素的指针。所以把return类型设为gradeCalculationconst char *。然后把所有的字符常量都改成字符串字面量,比如"F""A+""Marks is not valid"。注意使用引号而不是撇号。字符串文字表示一个字符数组,包括一个空字符来标记结束。

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

  1. 在行 printf("Grade: %s\n", gradeCalculation(marks)); 中,函数 gradeCalculation() returns 是 int 而格式说明符是 %s 这是对于字符串(char *).

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

    case 90 ... 100:

    return 'A+';

    break;

    default:

    return 'Marks is not valid!';

这是 returning 字符串。

所以把return类型全部转成string就好了,改成char *即string.

下面是解决方案:-

#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;
}