2015-09-09 4 views
0

Привет, ребята, поэтому у меня возникают проблемы с методом обратной копии. Метод должен скопировать char * в обратном порядке.Как сделать обратную копию символов в C++

char* reverseCopy(char* destination, const char* source, int num) 
{ 
    char placeHolder; 
    for (int j=0; j<=num; j++) 
    { 
     strcpy(destination,source); 
    } 

    for (int i=0; i<num; num--) 
    { 
     placeHolder = destination[num]; 
     destination[i]=placeHolder; 
    } 
    destination[num]='\0'; 
    return destination; 
} 

Место назначения, где хранится копия.

Источник копируется символ

Num является количество символов в массиве

Любое понимание ценится. Спасибо

+0

Какой результат вы ожидаете, и какой результат вы получаете, точно? – jwueller

+0

Честно говоря, это слишком сложный код, чтобы перевернуть строку. – PaulMcKenzie

+0

Почему 'strcpy' внутри цикла ??? –

ответ

1

Но есть более простые и быстрые способы для этого: Например, зачем вам нужно скопировать source в destination в петлю?

А что, если destination == source?

Также этот цикл:

for (int i=0; i<num; num--) 
{ 
    placeHolder = destination[num]; 
    destination[i]=placeHolder; 
} 

неправильно написана и даже это было собственно написано цикл, вы бы переопределить не вернулись данные в destination.

Я надеюсь, что-то, как это будет работать (заботясь о том случае, source == destination возможно):

char* reverseCopy(char* destination, const char* source, int num) { 
    if (destination != source) 
    { 
     std::copy (source, source + num - 1, destination); 
    } 
    std::reverse(destination ,destination + num - 1); 
    destination[num-1] = '\0'; 

    return destination; 
} 
+0

Это UB, потому что он будет идти от 0 до -1, -2 и т. Д. И он будет петлять 2^31 раз – Quest

0

Вы всегда можете переключить их на строки и использовать source.rbegin() с функцией копирования.

+0

Возможно, вы захотите разработать, технически это строки, но не 'std :: string' –

0

Я мог бы написать эту функцию следующим образом:

char* reverseCopy(char* destination, const char* source, int num) { 
    char* d = destination; 
    while (num) { 
     *d++ = source[--num]; 
    } 
    *d = '\0'; 
    return destination; 
} 
+0

, что если 'destination == source' ?? –

+0

@AlexLop. Речь идет не об оптимизации. Он только хочет знать, как изменить строку. – Quest

+0

Тогда поведение было бы неопределенным, как и с библиотечными функциями, такими как memcpy при работе на перекрывающихся областях.Это вопрос, выходящий за рамки вопроса ОП. При желании источник сначала должен быть скопирован во временный буфер, а затем оттуда будет выполнена обратная копия. –

2

Будет ли это быть обман, чтобы используйте standard library algorithm?

char* reverseCopy(char* destination, const char* source, int num) 
{ 
    std::reverse_copy(source, source + num, destination); 
    destination[num] = '\0'; 
    return destination; 
} 
+0

К сожалению, я не могу использовать std lib. Я могу использовать только c-строки – GrapeSoda3

+1

@ GrapeSoda3: вам не нужно менять на 'std :: string', это работает с строками C, переданными как параметры. Если вам не разрешено использовать функции из '', то, думаю, вам придется изобретать это. Было бы неудачно, потому что есть много полезных [стандартных библиотечных алгоритмов] (http://en.cppreference.com/w/cpp/algorithm). – Blastfurnace

+0

@ GrapeSoda3 Просто посмотрите на образец кода для 'std :: reverse_copy' и установите его на этом. –

0

Нажмите строку, символ на гольца, в стек STL, затем вытолкнуть символы с вершины стека, в новую строку.

Они будут отменены.

+0

Это решение использует дополнительную память. –

Смежные вопросы