Возвращение строки из функции в C - PullRequest
2 голосов
/ 15 сентября 2011
char* clean_string (char *input_string){
  /*Ensure that input string isn't null and only do heavy lifting if it's not null*/
  if (input_string){
    char *stripped;
    stripped = (char*)malloc(strlen(input_string)*sizeof(char));
    while (*input_string != '\0'){
      if isalpha(*input_string){
        *stripped = toupper(*input_string);
    input_string++;
    stripped++;
      } else {
        input_string++;
    }
  }
/*       *stripped++ += '\0';*/
   return stripped;
  }
 /*default return val*/  
return NULL;
}

Кто-нибудь может сказать мне, где я не так? Пытался выполнить тестовый прогон, и он не выдает ничего, когда я пытаюсь вызвать его.

Ответы [ 4 ]

7 голосов
/ 15 сентября 2011

Вы возвращаете указатель на последний символ в строке (stripped++?).
Вы выделяете один байт слишком мало (должно быть strlen(...) + 1).

stripped = (char*)malloc(strlen(input_string)*sizeof(char)); /* Wrong. */
stripped = (char*)malloc(strlen(input_string) + 1);

/* .. */
stripped++;

/* .. */
return stripped;

Попытайтесь сохранить копию, например, original_stripped = stripped, прежде чем начинать изменять stripped и вернуть скопированное значение (а не увеличенное).

2 голосов
/ 15 сентября 2011

Проблема в том, что вы увеличиваете свою раздетую переменную перед ее возвратом.Попробуйте:

char *stripped; 
char *result;
stripped = (char*)malloc(strlen(input_string)*sizeof(char)); 
result = stripped;
...
return result; 
2 голосов
/ 15 сентября 2011

Проблема с вызовом stripped++.Вы модифицируете указатель, который вы получаете malloc.Создайте дополнительный указатель char *result_char = stripped; и используйте его для итерации по полученной строке.

0 голосов
/ 15 сентября 2011

Как насчет просто:

    char* clean_string (char *input_string)
    {
      /*Ensure that input string isn't null and only do heavy lifting if it's not null*/
        if (input_string)
        {
            char *stripped;
            int i;

            stripped = (char*)malloc(strlen(input_string)*sizeof(char) + 1);

            for(i=0; i < strlen(input_string); i++)
                stripped[i] = (isalpha(input_string[i]) ? toupper(input_string[i]) : input_string[i]);

            return stripped;
        }
     /*default return val*/  


return NULL;
}
...