当我尝试使用printf(" %s",course_comment(1.0) );
调用我的函数时,程序崩溃了。这是我的功能:
char *course_comment(float b)
{
if(b < 2.0)
return("Retake");
}
为什么会崩溃?我该如何解决?
答案 0 :(得分:4)
如果你的字符串是常量并且无意修改结果,那么使用字符串文字是最好的选择,例如:
#include <stdio.h>
static const char RETAKE_STR[] = "Retake";
static const char DONT_RETAKE_STR[] = "Don't retake";
const char *
course_comment (float b)
{
return b < 2.0 ? RETAKE_STR : DONT_RETAKE_STR;
}
int main()
{
printf ("%s or... %s?\n",
course_comment (1.0),
course_comment (3.0));
return 0;
}
否则,您可以使用strdup
克隆字符串(不要忘记free
):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *
course_comment (float b)
{
char result[256];
if (b < 2.0)
{
snprintf (result, sizeof (result), "Retake %f", b);
}
else
{
snprintf (result, sizeof (result), "Do not retake %f", b);
}
return strdup (result);
}
int main()
{
char *comment;
comment = course_comment (1.0);
printf ("Result: %s\n", comment);
free (comment); // Don't forget to free the memory!
comment = course_comment (3.0);
printf ("Result: %s\n", comment);
free (comment); // Don't forget to free the memory!
return 0;
}
答案 1 :(得分:3)
根据您首次调用'course_comment'时程序的顺序/结构 - 它可能是未声明的&amp; C将其返回类型默认为'int'。当你犯错误时,检查编译器警告。
同时确保您了解功能原型,何时&amp;应该使用它们(基本上到处都是)。我认为1.0上缺少'f'意味着参数将自动转换为int。
这有效 - 不是我会这样做的:
#include <stdio.h>
const char *course_comment(float b); // <- fn prototype
int main(int argc, char *argv[]) {
printf(" %s",course_comment(1.0f));
}
const char *course_comment(float b)
{
if(b < 2.0)
return("Retake");
}
答案 2 :(得分:2)
您可能应该将文字作为const char *返回,因为它们无法修改。
如果b不小于2.0,你的函数会返回什么? 如果您尝试使用返回值,您认为会发生什么? 你确切的代码是什么崩溃?
答案 3 :(得分:1)
答案 4 :(得分:1)
因为从1.0获取NULL指针不会返回任何内容。
不是你的功能崩溃,printf崩溃:
printf(" %s", NULL);
经验法则:
答案 5 :(得分:1)
返回一个不太特别漂亮的指针。你可以做的最不邪恶的事情是这样的:
<强>的main.c 强>
#include "some_other_file.h"
int main()
{
printf(" %s", course_comment(1.0f) );
return 0;
}
<强> some_other_file.h 强>
#ifndef YADA_YADA_H
#define YADA_YADA_H
const char* course_comment(float b);
#endif
<强> some_other_file.c 强>
static const char COMMENT_RETAKE [] = "Retake";
const char* course_comment(float b)
{
const char* result;
if(b < 2.0f)
{
result = COMMENT_RETAKE;
}
else
{
result = ""; /* empty string */
}
return result;
}
请注意,处理浮点数时应使用1.0f表示法,处理双打时应使用1.0表示法。否则,编译器将对变量进行无声促销以使其变倍,并且代码将变慢。
答案 6 :(得分:0)
如果要返回return "blah"
之类的字符串文字,则返回类型应为const char*
。