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

时间:2011-02-10 15:07:11

标签: c string

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

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

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

7 个答案:

答案 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)

请参阅此answer

正如其他人所说的那样添加一个带有一些返回值的别人......请告诉我们错误是什么,请!

MY2C

答案 4 :(得分:1)

因为从1.0获取NULL指针不会返回任何内容。

不是你的功能崩溃,printf崩溃:

printf(" %s", NULL);

经验法则:

  • 始终有定义的回报
  • gcc -Wall向您显示所有警告

答案 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*