为什么我会得到两个不同的字符串?

时间:2011-12-08 22:07:36

标签: c++ string arrays

我写了一个非常简单的加密程序来练习c ++,我遇到了这种奇怪的行为。当我通过设置字符串等于数组将我的char *数组转换为字符串时,我得到一个错误的字符串,但是当我创建一个空字符串并添加单独追加数组中的字符时,它会创建正确的字符串。有人可以解释为什么会发生这种情况,我上周刚开始用c ++编程,我无法弄清楚为什么这不起作用。

顺便说一句,我在网上查了一下,这些显然都是将char数组转换成字符串的有效方法。

void expandPassword(string* pass)
{
    int pHash = hashCode(pass);
    int pLen = pass->size();
    char* expPass = new char[264];
    for (int i = 0; i < 264; i++)
    {
        expPass[i] = (*pass)[i % pLen] * (char) rand();
    }
    string str;
    for (int i = 0; i < 264; i++)
    {
        str += expPass[i];// This creates the string version correctly
    }

    string str2 = expPass;// This creates much shorter string
    cout <<str<<"\n--------------\n"<<str2<<"\n---------------\n";

    delete[] expPass;
}

编辑:我从数组中删除了所有的零,并没有改变任何内容

4 个答案:

答案 0 :(得分:0)

正在构建的c字符串是一系列以\ 0(零)ascii值结尾的字符。

的情况

expPass[i] = (*pass)[i % pLen] * (char) rand();

如果表达式的计算结果为0,则可能会将\ 0插入数组,并且不会在字符串末尾追加\ 0以确保它是有效的c字符串。

当你做

string str2 = expPass;

很可能是字符串变短了,因为当它在字符串中的某处找到\ 0时会被截断。

答案 1 :(得分:0)

从char *复制到std :: string时,赋值运算符在到达第一个NULL字符时停止。这表明您的“加密”问题导致嵌入的NULL字符。

这是编码与加密数据一起使用的主要原因之一。加密后,结果数据应使用Hex / base16或base64算法进行编码。

答案 2 :(得分:0)

这是因为str2 = expPassexpPass解释为C风格的字符串,这意味着零值(“null”)字节'\0'表示字符串的结尾。所以,例如,这个:

char p[2];
p[0] = 'a';
p[1] = '\0';
std::string s = p;

将导致s长度为1,因为p在终止'\0'之前只有一个非零字节。但是这个:

char p[2];
p[0] = 'a';
p[1] = '\0';
std::string s;
s += p[0];
s += p[1];

会导致s长度为2,因为它会明确地将两个字节都添加到s。 (A std::string与C风格的字符串不同,可以包含实际的空字节 - 尽管利用它并不总是一个好主意。)

答案 3 :(得分:0)

我猜以下一行会剪掉你的字符串:

expPass[i] = (*pass)[i % pLen] * (char) rand();

如果rand()返回0,则在位置i处得到一个字符串终止符。