我写了一个非常简单的加密程序来练习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;
}
编辑:我从数组中删除了所有的零,并没有改变任何内容
答案 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 = expPass
将expPass
解释为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处得到一个字符串终止符。