为什么我得到两个不同的字符串
Why am i getting two different strings?
我写了一个非常简单的加密程序来练习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 = expPass
将expPass
解释为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处得到字符串终止符。
- 两个字符串在 c++ 中不相等
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 比较两个字符串后卡在无限循环中
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 使用XOR查找O(n)-解决方案中的两个字符串是否为变位符
- 如何将两个字符串加在一起,就好像它们是变量一样?
- 我需要帮助在一个类中输入两个字符串并获取其输出
- 两个字符串之间的数学运算
- sscanf() 有两个字符串参数
- 我的字符串数组一次打印出前两个字符串
- 两个 c++ 字符串上的异或
- 函数返回两个字符串的第一个常用字符
- 目标是找到两个 c 字符串之间的公共前缀(必须使用特定的函数标头)
- 我需要在C++的两个字符串之间找到共同的前缀
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 给定两个字符串 S 和 T.确定与 T 相差最小的 S 子字符串?
- gtest:检查字符串是否等于两个字符串之一
- 交换两个字符串时访问正确的内存时,我遇到了分段错误
- 我可以在系统()中使用两个字符串吗?