我怎么能写一个在c中返回一个字符串的函数?

当我尝试使用printf(" %s",course_comment(1.0) );调用我的函数时printf(" %s",course_comment(1.0) ); ,程序崩溃了。 这是我的function:

 char *course_comment(float b) { if(b < 2.0) return("Retake"); } 

为什么会崩溃? 我该如何解决?

如果你的字符串是常量并且无意修改结果,那么使用字符串文字是最好的选择,例如:

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

根据程序的顺序/结构,当首次调用’course_comment’时 – 它可能是未声明的,C将默认其返回类型为’int’。 当你错误编译时检查编译器警告。

还要确保你了解function原型,何时何地应该使用它们(基本上到处都是)。 我认为1.0上缺少’f’意味着该参数将自动转换为int。

这有效 – 不是我会这样做的:

 #include  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"); } 

您应该将文字作为const char *返回,因为它们无法修改。

如果b不小于2.0,你的函数会返回什么? 如果您尝试使用返回值,您认为会发生什么? 你确切的代码是什么崩溃?

看到这个答案

正如其他人说的那样添加一些具有一定回报价值的东西……请告诉我们确切的错误是什么,拜托!

MY2C

因为你从1.0获得一个NULL指针不返回任何东西。

不是你的function崩溃,printf崩溃:

printf(" %s", NULL);

经验法则:

  • 总是有一个确定的回报
  • gcc -Wall向您显示所有警告

返回一个不是特别漂亮的指针。 你可以做的最不邪恶的事情是这样的:

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表示法。 否则编译器会对变量进行无声促销以使其变倍,并且代码将变慢。

如果要返回字符串文字,如return "blah" ,则返回类型应为const char*