Как я могу написать функцию, которая возвращает строку в C? - PullRequest
3 голосов
/ 10 февраля 2011

Когда я пытаюсь вызвать мою функцию с помощью printf(" %s",course_comment(1.0) );, программа вылетает.Это моя функция:

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

Почему происходит сбой?Как я могу это исправить?

Ответы [ 7 ]

4 голосов
/ 10 февраля 2011

Если ваши строки являются константами, и вы не собираетесь изменять результат, лучше всего подойдет работа со строковыми литералами, например ::10000

#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;
}
3 голосов
/ 10 февраля 2011

В зависимости от порядка / структуры вашей программы при первом вызове 'course_comment' - возможно, он не объявлен, и C по умолчанию возвращает тип возвращаемого значения 'int'. Проверьте, нет ли предупреждений компилятора при ошибке .. compile.

Также убедитесь, что вы понимаете о прототипах функций, когда и где они должны использоваться (в основном везде). Я думаю, что 'f' отсутствует в 1.0 означает, что аргумент будет автоматически приведен к 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 голосов
/ 10 февраля 2011

Вам, вероятно, следует возвращать литерал в виде const char *, поскольку они не могут быть изменены.

что возвращает ваша функция, если b не меньше 2,0?Как вы думаете, что произойдет, если вы попытаетесь использовать возвращаемое значение?Ваш точный код, что сбой?

1 голос
/ 10 февраля 2011

Возвращать указатель, как это не особенно красиво. Наименее злое, что вы можете сделать, это что-то вроде этого:

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.0f при работе с двойными числами. В противном случае компилятор выполнит двойное продвижение ваших переменных, и код станет медленнее.

1 голос
/ 10 февраля 2011

потому что вы получаете NULL-указатель начиная с 1.0, ничего не возвращает.

Не ваша функция падает, printf падает с:

printf(" %s", NULL);

ПравилоThumb:

  • всегда имеет определенный возврат
  • gcc -Wall показывает все предупреждения
1 голос
/ 10 февраля 2011

см. ответ

Как сказал другой, добавьте else с некоторым возвращаемым значением ... И скажите нам точно, в чем ошибка, пожалуйста!

my2c

0 голосов
/ 10 февраля 2011

Если вы хотите вернуть строковый литерал, например return "blah", тип возвращаемого значения должен быть const char*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...