2011-09-25 2 views
4

Язык: CСвертывание строки в C с помощью указателей?

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

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] Я уже писал реализации с использованием буфера и без угл. Спасибо, что!

+0

Вы можете бесплатно 'string', если он больше не нужен, который не оставит вас с того, чтобы освободить только одну вещь. Однако освобождение его здесь считается очень плохим программированием, так как это неожиданный побочный эффект. –

+0

Вы также можете использовать статический символ **, который указывает на указатель на область памяти, которую вы выделяете при первом вызове, и повторно использовать по мере необходимости на последующих. Я бы не использовал этот подход, потому что вы не будете знать, когда последний звонок будет таким, чтобы вы не могли освободить память, но это могло бы произвести впечатление на них в интервью. :) – Uffe

ответ

8

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

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

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

Вы можете сделать это таким образом и позволить вызывающему абоненту отвечать за 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 
+1

Если вы хотите, чтобы вызывающий абонент отвечал за освобождение памяти, лучший способ убедиться в том, что они не забыли сделать это, - заставить их выполнять выделение. –

0

Вы можете использовать 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 ; 
} 
0

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

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; 
} 
Смежные вопросы