C++ *字符数组到字符串(两次运行代码和两次不同的结果)
为什么同一代码有两个不同的结果,不总是交替的,但有时由*数组生成的字符串的长度为4,不同的时间的长度为6。最后2个字符是随机的C++ *字符数组到字符串(两次运行代码和两次不同的结果),c++,arrays,string,char,C++,Arrays,String,Char,为什么同一代码有两个不同的结果,不总是交替的,但有时由*数组生成的字符串的长度为4,不同的时间的长度为6。最后2个字符是随机的 字符串行查询; getline(cin,linequery); char*buffer=新字符[4]; size\t lengthh=linequery.copy(缓冲区,4,0); 字符串字符串缓冲区(buffer); cout很可能linequery.copy不会写入终止null,因此您依赖于buffer后面的下一个字符为null,这是不保证的。您应该使用以下内容构
字符串行查询;
getline(cin,linequery);
char*buffer=新字符[4];
size\t lengthh=linequery.copy(缓冲区,4,0);
字符串字符串缓冲区(buffer);
cout很可能linequery.copy
不会写入终止null,因此您依赖于buffer
后面的下一个字符为null,这是不保证的。您应该使用以下内容构建字符串:
string stringbuffer(buffer, dotpoint-lastdot);
可能是未定义的行为。您显示的代码不完整,因此我们无法重现和识别问题。请创建一个。如果改用字符串stringbuffer(buffer,dotpoint-lastdot)
,是否会消除不确定性?如果是这样,由lastdot
指向的字符串可能不会以NUL字节或linequery结尾。copy
不会添加NUL字节。如果不知道linequery
是什么,就有点难以确定。但似乎size\t lengthh=linequery.copy(缓冲区,4,0)代码>将四个字符复制到缓冲区。string
的构造函数,在stringbuffer(buffer)行中调用代码>假定传递的缓冲区中存在终止的'\0'
。如果不存在(例如,因为有四个字符已复制到缓冲区
,并且没有一个字符是'\0'
\),则该行为未定义。length:6
的输出表明没有'\0'
终止符,并且您的代码从四个字符的缓冲区复制了6个字符。谢谢,我现在理解了“不保证”它实际上保证是未定义的行为。它工作得很好。但是为什么以前的*char数组被定义为define[4]时字符串更长?@Jakintostd::string
ctor不知道缓冲区的大小。在这种形式下,它假设您向它传递一个以null结尾的字符串,如果没有终止,它将导致UB。如果您知道长度,请使用另一种形式的std::string
ctor。不,这两种情况都不起作用,欢迎来到UB。谢谢,我现在明白了