遗憾的是我无法弄清楚关于c ++这样的基本事情,但是c风格的字符串正在按照我的预期行事.例如,我创建它像这样:
char* cstr = new char[1];
它被初始化为:Íýýýýý«««««««««îţ.像往常一样,我可以设置第一个char,因为其他人并不存在(或者我认为它们不存在).在使用白色c风格字符串的同时,所有这些垃圾都被嵌入,一切正常.
现在我把std :: string和那些c-stlye混合了,我得到的是一团糟.惠特这段代码:
std::string str = "aaa";
str += cstr;
char* cstr = new char[1];
std::string str = "aaa";
str += cstr;
我最终决定:aaaÍýýýýý««««««««îţ,但现在这些字符实际存在为string.size()返回长度,包括这个垃圾.
我找不到为什么会发生这种情况,但必须连接whit string创建,因为像char*cstr ="aaa"这样的东西导致aaa没有任何额外的垃圾,但尝试更改字符串初始化这种方式会导致内存访问违规.有人能解释一下这种行为吗?谢谢!
PS:我的JavaScript无法加载,所以如果有人可以正确格式化这篇文章,我会很高兴!
答:天啊!我怎么能忘记这一点...感谢所有的,好的,立即回答.最好的一个来自minitech,所以我会在我的java脚本加载时将其标记为答案:/
所有C风格的字符串都以空值终止.因此,使用初始化的字符串new char[1]会使空格中没有字符.你不能将第一个字符设置为任何东西\0,否则正常的字符串操作将一直读入内存,直到它们找到零.所以请new char[2]改用.
使用C风格的字符串时,您需要使用null终止符:
char* cstr = new char[2];
cstr[0] = 'X';
cstr[1] = '\0';
Run Code Online (Sandbox Code Playgroud)
说了这么多,做上面的代码真的很糟糕.只是使用,std::string除非你有一个很好的理由.它会为您处理内存分配和解除分配.