Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ *字符数组到字符串(两次运行代码和两次不同的结果)_C++_Arrays_String_Char - Fatal编程技术网

C++ *字符数组到字符串(两次运行代码和两次不同的结果)

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,这是不保证的。您应该使用以下内容构

为什么同一代码有两个不同的结果,不总是交替的,但有时由*数组生成的字符串的长度为4,不同的时间的长度为6。最后2个字符是随机的

字符串行查询;
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]时字符串更长?@Jakinto
std::string
ctor不知道缓冲区的大小。在这种形式下,它假设您向它传递一个以null结尾的字符串,如果没有终止,它将导致UB。如果您知道长度,请使用另一种形式的
std::string
ctor。不,这两种情况都不起作用,欢迎来到UB。谢谢,我现在明白了