将异或函数转换为返回char*而不是字符串

Convert XOR function to return char* not string

本文关键字:字符串 char 返回 函数 转换      更新时间:2023-10-16

我使用字符串编码这个异或,但我现在需要返回一个字符*。我已经尝试了几个小时了,尽管我不太习惯和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*返回?

编辑澄清:我需要一个char*: char* XOR(string s, int key)

编辑:这是错误,但在@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;
}

您的输入字符串是否可重写?如果是这样,这是最简单、可能也是最快的方法:

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

它改变给定的字符串,而不是返回新的东西。但是由于您很有可能在输出中得到字符,因此您可能会发现这样更可靠:

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] = ''; // only needed if you need a null-capped string, which seems unlikely since your string could well contain nulls anyway
    return r;
}
相关文章: