文字列を逆順に並べる

string-reverse.png

よく出てくる採用試験に出てくる問題が「文字列を逆順に並べ替える」です
たとえば、

void reverse(char* str) という終端\0 の文字列を並び替える関数を実装してください

という問題が出たとします。
さて、どうやって組みますか?
私が最初にいそいでやった方法はこうです

#include <stdio.h>
#include <conio.h>
#include <string>
#include <deque>
using namespace std;
 char* reverse(const char* str){
     deque<char> revertedq;
 
     int i=0;
     while(str[i]!='\0'){
        revertedq.push_front(str[i]);
            i++;
    }
      char* reverted=new char[i];
     deque<char>::iterator it=revertedq.begin();
     i=0;
     while(it!=revertedq.end()){
         reverted[i]=*it;
         it++;
         i++;
     }
     reverted[i]='\0';
     return reverted;
}

お便利にdequeを使ってしまいましたが、もしSTLが使えなかったらどうする?

もしCだけで実装しろと言われたら。。。

ポインターを上手に使って解決しましょう★
あと、nullチェックも忘れずにね☆

 char* reverse(char* str){
     if(str==0){return 0;}//ぬるぽ排除
     //Step1.終端文字を探す
      char* end=str;
     while(*end){
         ++end;
     }
     //null文字から1文字戻る
     --end;
     char tmp;
 
     while(str<end){
         tmp=*str;
         *str++=*end;
         *end--=tmp;
     }
     end--;
     return end;
}
これはどういう仕組みになっているのかというと
最初ポインタ達はこの位置にいます
step1.png
whileの内側をワンループ進んだ後はこうなっています
step2.png
並び替え終えるときは、イコール、strとendポインターが出会うときです
step3.png
このままendを答えとして返しちゃうとiから始まってしまうので最後にendをもう一度デクリメントします

サポートサイト Wikidot.com