在c中处理和编写返回字符串的函数?

在c中处理和编写返回字符串的函数?,c,string,C,String,我一直在为一个调用返回字符串的函数的程序而挣扎。我有了一些想法,似乎很管用,但程序还是崩溃了。这是代码的一部分 printf("CSC 1100 %d %s %f %s\n ",fm_csc_1100[i] ,grades(fm_csc_1100[i]),gradepoint(fm_csc_1100[i]),course_comment(gradepoint(fm_csc_1100[i])) ); printf("CSK 1101

我一直在为一个调用返回字符串的函数的程序而挣扎。我有了一些想法,似乎很管用,但程序还是崩溃了。这是代码的一部分

printf("CSC 1100       %d           %s       %f          %s\n ",fm_csc_1100[i] ,grades(fm_csc_1100[i]),gradepoint(fm_csc_1100[i]),course_comment(gradepoint(fm_csc_1100[i])) );

printf("CSK 1101       %d           %s       %f          %s\n ",fm_csk_1101[i] ,grades(fm_csk_1101[i]),gradepoint(fm_csk_1101[i]),course_comment(gradepoint(fm_csk_1101[i])) );
该程序使用for循环来显示学生的分数。这些分数已输入程序的前一部分。该函数调用workfine并显示第一行printf,然后崩溃。返回字符串的函数是成绩和课程注释。下面是代码

char *grades(int z)
{   char *temp3 = "A+";
    char *temp4 = "A";
    char *temp5 = "B+";
    char *temp6 = "B";
    char *temp7 = "C+";
    char *temp8 = "C";
    char *temp9 = "D+";
    char *temp10 = "D";
    char *temp11 = "E";
    char *temp12 = "E-";
    char *temp13 = "F";
     if(z >= 90)
     return temp3;
     else if (z >= 80 && z<=89)
     return temp4;
     else if (z >= 75 && z<=79)
     return temp5;
     else if (z >= 70 && z<=74)
     return temp6;
     else if (z >= 65 && z<=69)
     return temp7;
     else if (z >= 60 && z<=64)
     return temp8;
     else if (z >= 55 && z<=59)
     return temp9;
     else if (z >= 50 && z<=54)
     return temp10;
     else if (z >= 45 && z<=49)
     return temp11;
     else if (z >= 40 && z<=44)
     return temp12;
     else
     return temp13;
     }  

所有这些返回字符串和程序编译和运行良好,但崩溃。如何正确处理这些函数?

您是否给出了函数course\u comment()的完整定义?如果是这样,你就有问题了。如果b>=2.0,返回什么?

课程注释在某些条件下没有明确的返回值。你不应该让这种事情发生;如果没有其他注释,则返回空字符串。例如:

char *course_comment(float b)
{
     char *retake="Retake";
     if (b < 2.0) {
          return retake;
     }
     return "";
}
char*课程注释(浮动b)
{
char*retake=“retake”;
如果(b<2.0){
返回重拍;
}
返回“”;
}
如果函数返回时未显式返回值,则结果未定义。这通常意味着您的程序将崩溃。(这实际上是最好的情况;最坏的情况是它不会崩溃,但会给出不可靠的结果。)

(顺便说一下,我相信您可以找到比
temp
temp1
、…
temp13
等更好的字符串名称。)


编辑:最初,我写的
学生评语
也有同样的问题,但那是我的错误。至少在当前形式下,它总是返回一个指向有效字符串文本的指针。(代码的格式化方式使跟踪逻辑变得更加困难。我已经修复了格式。)

如果条件为false,您忘记返回一些内容。e、 g

char *course_comment(float b)
{    char *temp ="Retake";
     if(b < 2.0)
      return temp;
}
char*课程注释(浮动b)
{char*temp=“重新制作”;
如果(b<2.0)
返回温度;
}
应该是

char *course_comment(float b)
{
     if(b < 2.0)
        return "retake"

     return "";
}
char*课程注释(浮动b)
{
如果(b<2.0)
返回“重拍”
返回“”;
}
类似于
student\u comment()
函数。
如果您打开编译器警告,编译器应该就此向您发出警告-保持程序没有警告。

将此警告交给您的教授:

struct Grade_Range
{
  const char * grade_text;
  unsigned int lower_limit; // inclusive.
  unsigned int upper_limit; // inclusive.
};

static const struct Grade_Range grade_table[] =
{
  {"A+", 90, 100},
  {"A ", 80,  89},
  {"B+", 75,  79},
  {"B ", 70,  74},
  {"C+", 65,  69},
  {"C ", 60,  64},
  {"D+", 55,  59},
  {"D ", 50,  54},
  {"E ", 45,  49},
  {"E-", 40,  44},
  {"F ",  0,  39},
}
static const unsigned int NUM_GRADE_ENTRIES =
    sizeof(grade_table) / sizeof(grade_table[0]);

const char * grades(unsigned int score)
{
  static const char * unknown_score = "Unknown Score";
  const char * result = unknown_score;
  unsigned int index = 0;
  for (index = 0; index < NUM_GRADE_ENTRIES; ++index)
  {
    if ((score >= grade_table[i].lower_limit)
        && (score <= grade_table[i].upper_limit))
    {
       break;
    }
  }
  if (index < NUM_GRADE_ENTRIES)
  {
    score = grade_table[i].grade_text;
  }
  return score;
}
struct Grade\u范围
{
常量字符*等级文本;
无符号整数下限;//包括在内。
无符号整数上限;//包括在内。
};
静态常量结构等级\范围等级\表格[]=
{
{“A+”,90100},
{“A”,80,89},
{“B+”,75,79},
{“B”,70,74},
{“C+”,65,69},
{“C”,60,64},
{“D+”,55,59},
{“D”,50,54},
{“E”,45,49},
{“E-”,40,44},
{“F”,0,39},
}
静态常量无符号int NUM\u GRADE\u条目=
sizeof(等级表)/sizeof(等级表[0]);
常量字符*等级(无符号整数分数)
{
静态常量字符*unknown_score=“unknown score”;
常量字符*结果=未知分数;
无符号整数索引=0;
对于(索引=0;索引=等级表[i]。下限)

&&(你问了几乎相同的问题:你不需要临时变量,只要写‘return’A+)'在grade中,您不需要指定低于X的等级,因为程序流只会处理低于上一个'grade lower boundary'的情况。顺便说一句,最好不要命名变量
temp
,因为这不会增加可读性(例如
temp1
)。可以使用更好的名称“grade\u A\u text”或“progress\u text”。有时不需要变量:
如果(c>2.0)返回“progress”;否则返回“Stay Put”;
…或者,正如上面有人指出的,直接返回文本,避免了“temp”变量的需要。回答得好;+1。
char *course_comment(float b)
{
     if(b < 2.0)
        return "retake"

     return "";
}
struct Grade_Range
{
  const char * grade_text;
  unsigned int lower_limit; // inclusive.
  unsigned int upper_limit; // inclusive.
};

static const struct Grade_Range grade_table[] =
{
  {"A+", 90, 100},
  {"A ", 80,  89},
  {"B+", 75,  79},
  {"B ", 70,  74},
  {"C+", 65,  69},
  {"C ", 60,  64},
  {"D+", 55,  59},
  {"D ", 50,  54},
  {"E ", 45,  49},
  {"E-", 40,  44},
  {"F ",  0,  39},
}
static const unsigned int NUM_GRADE_ENTRIES =
    sizeof(grade_table) / sizeof(grade_table[0]);

const char * grades(unsigned int score)
{
  static const char * unknown_score = "Unknown Score";
  const char * result = unknown_score;
  unsigned int index = 0;
  for (index = 0; index < NUM_GRADE_ENTRIES; ++index)
  {
    if ((score >= grade_table[i].lower_limit)
        && (score <= grade_table[i].upper_limit))
    {
       break;
    }
  }
  if (index < NUM_GRADE_ENTRIES)
  {
    score = grade_table[i].grade_text;
  }
  return score;
}