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