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

Why am i getting two different strings?

本文关键字:两个 字符串 为什么      更新时间:2023-10-16

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

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

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;
}

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

从char*复制到std::string时,当到达第一个NULL字符时,赋值操作符停止。这表明你的"加密"存在问题,导致嵌入NULL字符。

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

c-string,因为您正在构建的是一系列以(零)ASCII值结尾的字符。

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

如果表达式的计算结果为0,则可以在数组中插入,并且在字符串末尾不附加以确保它是一个有效的c-string。

当你做

string str2 = expPass;

很可能是字符串变得更短,因为当它在字符串中找到时,它会被截断。

这是因为str2 = expPassexpPass解释为c风格的字符串,这意味着零值("null")字节''表示字符串的结束。例如:

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

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

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

将导致s的长度为2,因为它显式地将两个字节都添加到s中。(与c风格的字符串不同,std::string可以包含实际的空字节—尽管利用这一点并不总是一个好主意

我猜下面这行切断了你的字符串:

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

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