2013-03-08 17 views
1

Я знаю, что конец возврата неверен, я собираюсь использовать один из моих указателей, чтобы идти в конец, а затем вернуться к размеру строки, чтобы вернуть обратную строку. Есть ли более эффективный способ сделать это? Кроме того, что еще более важно, я получаю ошибку времени выполнения здесь? http://ideone.com/IzvhmWОшибка времени выполнения обратная строка

#include <iostream> 
#include <string> 

using namespace std; 

string Reverse(char * word) 
{ 
    char *end = word; 
    while(*end) 
     ++end; 
    --end; 

    char tem; 
    while(word < end) { 
      tem = *word; 
      *word = *end; 
      *end = tem; //debug indicated the error at this line 

      ++word; 
      --end; 
    } 

    return end; 
} 

int main(int argc, char * argv[]) { 
    string s = Reverse("piegh"); 
    cout << s << endl; 
    return 0; 
} 
+1

Просто прочитать сообщения об ошибках вашего компилятора! 'x.cpp: 27: 31: warning: устаревшее преобразование из строковой константы в 'char *' [-Wwrite-strings]' Предупреждение активируется, даже не указывая -Wall. – kay

+0

Действительно. Предупреждения существуют с определенной целью и никогда не должны игнорироваться! Это предупреждение должно было быть обязательно предоставлено как часть этого вопроса. – Sebivor

ответ

4

можно передать «piegh» в обратном направлении, который преобразуется в указатель на символ. Этот указатель на символ указывает на литерал только для чтения. Возможно, вы имели в виду, чтобы скопировать строку литерал «piegh» перед тем, как назначить ей:

char fubar[] = "piegh"; 
string s = Reverse(fubar); 

В конце концов, как вы могли бы оправдать "piegh"[0] = "peigh"[4];?

-1

Что делает эта часть вашего кода? while(*end) ++end; //Assuming you are moving your pointer to hold the last character but not sure y --end; // у этого один while(word < end) // Также я не уверен, как это работает

Этот код работает и служит той же цели

char* StrReverse(char* str) 
{ 
int i, j, len; 
char temp; 
char *ptr=NULL; 
i=j=len=temp=0; 

len=strlen(str); 
ptr=malloc(sizeof(char)*(len+1)); 
ptr=strcpy(ptr,str); 
for (i=0, j=len-1; i<=j; i++, j--) 
{ 
    temp=ptr[i]; 
    ptr[i]=ptr[j]; 
    ptr[j]=temp; 
} 
return ptr; 
} 
+0

Это также излишне неряшливо: 'strlen' возвращает' size_t', но 'len' является' int' (что может привести к неисправности этого кода), 'sizeof (char)' is * always * 1, поэтому нет необходимости умножайте 'len + 1' на него,' temp' объявляется в самом неэлегантном месте в верхней части StrReverse, а не в цикле, в котором он используется, и код заставляет вызывающего пользователя управлять памятью с помощью 'free' (длительность хранения должен быть выбором вызывающего, для очевидной простоты и производительности). После устранения этих проблем будет множество ненужных переменных; Этот код слишком сложный. – Sebivor

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