【问题标题】:Format specifier %s in not showing result格式说明符 %s 未显示结果
【发布时间】:2021-11-24 06:29:51
【问题描述】:

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

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

【问题讨论】:

  • %s 用于char *,因为您只返回int,要获得char 表示,请使用%c
  • 如果我使用 %c 则不会打印默认大小写。
  • 您如何期望'Marks is not valid!' 被表示为int
  • 我刚刚注意到,return 'Marks is not valid!'; 是错误的。您应该使用" "(双引号)。并将您的函数返回类型更改为char *。这样你就可以使用%s
  • 更改函数的返回类型,因为它在默认情况下返回字符串

标签: c if-statement switch-statement string-literals function-definition


【解决方案1】:

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

case 90 ... 100:

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

你的函数返回一个int类型的对象

int gradeCalculation(int marks) {

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

函数返回类型应该是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;
}

.

【讨论】:

  • 非常感谢。您的解决方案解决了我的问题。我不小心用了单引号而不是双引号。
  • @SatyajitRoy 完全没有。不客气。:)
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多