Реверсировать строку в C с помощью указателей? - PullRequest
4 голосов
/ 25 сентября 2011

Язык: C

Я пытаюсь запрограммировать функцию C, которая использует заголовок char * strrev2 (const char * string) как часть подготовки к собеседованию, наиболее близкое (рабочее) решение приведено ниже, однако яхотел бы реализацию, которая не включает malloc ... Это возможно?Поскольку он возвращает символьное значение, если я использую malloc, в другой функции необходимо использовать free.

char *strrev2(const char *string){
    int l=strlen(string);
    char *r=malloc(l+1);
    for(int j=0;j<l;j++){
        r[j] = string[l-j-1];
    }
    r[l] = '\0';
    return r;
}

[EDIT] Я уже написал реализации с использованием буфера и безсимволСпасибо, что!

Ответы [ 4 ]

8 голосов
/ 25 сентября 2011

Нет - вам нужен malloc.

Другие варианты:

  • Изменить строку на месте , но, поскольку у вас есть const char *и вам не разрешено изменять сигнатуру функции, здесь это невозможно.
  • Добавьте параметр, чтобы пользователь предоставлял буфер, в который записывается результат, но опять же это невозможно без измененияподпись (или использование глобалов, что очень плохая идея).
3 голосов
/ 25 сентября 2011

Вы можете сделать это таким образом и позволить вызывающему абоненту отвечать за free память. Или вы можете позволить вызывающей стороне передавать в выделенный буфер символов, таким образом, выделение и освобождение выполняются вызывающей стороной:

void strrev2(const char *string, char* output)
{
    // place the reversed string onto 'output' here
}

Для звонящего:

char buffer[100];
char *input = "Hello World";
strrev2(input, buffer);
// the reversed string now in buffer
0 голосов
/ 26 сентября 2011

обратная строка на месте

char *reverse (char *str)
{
  register char c, *begin, *end;
  begin = end = str;

  while (*end != '\0') end ++;

  while (begin < --end) 
  {
    c = *begin;
    *begin++ = *end;
    *end = c;
  }
  return str;
}
0 голосов
/ 25 сентября 2011

Вы можете использовать static char[1024]; (примерный размер 1024), сохранить все строки, используемые в этом буфере, и вернуть адрес памяти, который содержит каждую строку.Следующий фрагмент кода может содержать ошибки, но, вероятно, даст вам идею.

#include <stdio.h>
#include <string.h>

char* strrev2(const char* str)
{

    static char buffer[1024];
    static int  last_access; //Points to leftmost available byte;

    //Check if buffer has enough place to store the new string
    if( strlen(str) <= (1024 - last_access) )
    {
        char* return_address = &(buffer[last_access]);
        int i;

        //FixMe - Make me faster
        for( i = 0; i < strlen(str) ; ++i )
        {
            buffer[last_access++] = str[strlen(str) - 1 - i];
        }       

        buffer[last_access] = 0;
        ++last_access;

        return return_address;           
    }else
    {
        return 0;
    }
}

int main()
{
    char* test1 = "This is a test String";
    char* test2 = "George!";
    puts(strrev2(test1));
    puts(strrev2(test2));
    return 0 ;
}
...