0

この XOR は string を使用してコーディングしましたが、今は char* を返す必要があります。char の操作にはあまり慣れていませんが、これを何時間も試みてきました。ここで何かが足りないと思います。

string XOR(string s, int key){

 string res = "";

 for (size_t temp = 0; temp < s.size(); ++temp){
  res += s[temp] ^ ((key + temp) % 255);
 }
 return res;

}

これを変更して char* を返すにはどうすればよいですか?

明確にするために編集: I need a char* : char* XOR(string s, int key)

4

2 に答える 2

2

編集:バグがありましたが、@JonathanGrynspan と @john の助けを借りて修正されました。現在、私の最終バージョンは次のとおりです。

私はこれが美しくないことを知っていますが、それはあなたが望むことをします:

char* XOR(string s, int key){
 string res = "";
 for (size_t temp = 0; temp < s.size(); ++temp){
  res += s[temp] ^ ((key + temp) % 255);
 }
 char * cstr = new char [res.length()+1];
 copy(res.begin(),res.end(),cstr);
 return cstr;
}
于 2013-03-16T20:50:00.443 に答える
1

入力文字列は上書き可能ですか? その場合、これが最も簡単でおそらく最速の方法です。

void XOR( char *input, int key ){
    for(int temp = 0; input[temp] != '\0'; ++temp){
        input[temp] ^= (key + temp) % 255;
    }
}

何か新しいものを返す代わりに、指定された文字列を変更します。ただし\0、出力に文字が含まれる可能性は常にあるため、次の方法の方が信頼性が高くなる場合があります。

void XOR( char *input, int key, int length ){
    for(int temp = 0; temp < length; ++temp){
        input[temp] ^= (key + temp) % 255;
    }
}

(もちろん長さは変わりません)

アップデート:

コメントを見た後、これはあなたが望むものかもしれません。ただし、注意してください。返されたメモリを解放することを忘れないでください。これは、C++ のみのプログラマが慣れているものではありません。

char *XOR( const string &s, int key ) {
    const std::size_t l = s.size( );
    char *r = (char *) malloc( (l + 1) * sizeof( char ) );
    for( std::size_t i = 0; i < l; ++ i ) {
        r[i] = s[i] ^ ((key + (int) i) % 255)
    }
    r[l] = '\0'; // only needed if you need a null-capped string, which seems unlikely since your string could well contain nulls anyway
    return r;
}
于 2013-03-16T20:23:19.820 に答える