2016-05-13 8 views
0
#include <iostream> 
#include <cstring> 
using namespace std; 




void reverseString(char s[]) 
{ 
    int length = strlen(s); 
    for (int i = 0; s[i] != '\0'; i++) { 
     char temp = s[i]; 
     s[i] = s[length - i - 1]; 
     s[length - i - 1] = temp; 

     cout << s[i]; //this ends up printing "eooe" instead of reversing the whole string 
    } 
} 

int main() 
{ 
    char a[] = "Shoe"; 
    reverseString(a); 

    return 1; 
} 

アルゴリズムがどこで狂っているのか、それを修正するために何ができるのだろうと思っています。何かを見落としました。正しく動作します。関数は文字列を正しくリバースしません

+0

逆のアルゴリズムは問題ありません。forループの終了後に 'cout << s;'を入れてみてください。 – jjm

+0

@jjimは、関数を渡された引数をそのまま出力するのではなく、逆にする必要はありませんか? –

+0

いいえ、文字列を変更しています。 – jjm

答えて

0

以下のコードを使用します。あなたのアルゴは正しいですが、少し修正が必要

#include <stdio.h> 

void strrev(char *p) 
{ 
    char *q = p; 
    while(q && *q) ++q; 
    for(--q; p < q; ++p, --q) 
    *p = *p^*q, 
    *q = *p^*q, 
    *p = *p^*q; 
} 

int main(int argc, char **argv) 
{ 
    do { 
    printf("%s ", argv[argc-1]); 
    strrev(argv[argc-1]); 
    printf("%s\n", argv[argc-1]); 
    } while(--argc); 

    return 0; 
} 
+0

このコードは疑問に答えるかもしれませんが、いくつかの文脈を含めて、それがどのように動作し、いつ使用するかを説明する方が良いでしょう。コードのみの回答は長期的には有用ではありません。 – Bono

+0

主な 'char * p'を持ち、' ​​p'アドレスを 'q'ポインタにコピーします。その後、 'q'アドレスを最初の文字列から' while'ループで文字列の最後に移動します。最初の値を最後の値で 'for'ループとXOR演算子(ビット演算)に置き換えます。もしあなたが知りたいのであれば、その例を辿ってください。 –

2

を、あなたはlength/2回のアルゴリズムを実行する必要があります。あなたの文字列が内容を交換することを防ぎます。i = 2s = eohsにありますが、hoで再び交換されます。ブレークポイントを挿入してさらに理解してください。私は少しあなたの機能を変更します。

char* reverseString(char s[]) 
{ 
    int length = strlen(s); 
    for (int i = 0; i<length/2; i++) 
    { 
     char temp = s[i]; 
     s[i] = s[length - i - 1]; 
     s[length - i - 1] = temp; 
     //cout << s[i]; //this ends up printing "eooe" instead of reversing the whole string 
    } 

    return s; 
} 

int main() 
{ 
    char a[] = "Shoe"; 
    cout<<reverseString(a); 
    system("pause"); 
    return 1; 
} 
関連する問題