我有一个功能
ClassA::FuncA(const char *filePath)
并希望将此const char字符串*复制到char *!
我的解决方案:
char *argv[2];
int length = strlen(filePath);
argv[1] = new char(length +1);
strncpy(argv[1], filePath, length);
在此之后,我在argv [1]中得到了所需的字符,还有其他一些未定义的字符!
filePath:
“C:\ Users \用户用户A \Parameter.xmlþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþKŸQyá•”
这里有什么不对? strlen的长度还可以!
答案 0 :(得分:15)
像这样:
argv[1] = new char[length +1](); // () to value-initialize the array
您的版本:
argv[1] = new char(length +1);
仅分配一个char
并将其值初始化为length+1
。
答案 1 :(得分:1)
您的代码中存在两个问题:
复制后需要在长度上添加1才能复制空字符(因为strlen只返回没有空字符的字符数;请参阅更多here)。所以将代码更改为:
strncpy(argv [1],filePath,length + 1);
您需要修复数组的初始化方式,因为您只初始化一个字符(我们假设您希望复制完整的字符串)。所以:
argv [1] = new char [length + 1]();
注意:
答案 2 :(得分:1)
问题是您使用的是strncpy
,而不是strcpy
。和
您使用它的方式,它不会复制终止\0
。
实际上,因为strncpy
可能会留下没有\0
终止符的字符串,所以最好避免它。在你的情况下,单独strcpy
就好了,因为你刚刚分配了一个足够大的缓冲区。在更一般的情况下,您可能必须使用strlen
,以确保您拥有的字符串适合目标缓冲区(不会忘记为\0
添加1到结果中。) / p>
如果情况发生很多,您可能想要编写自己的版本
是strncpy
,它起作用(即保证终止\0
,和
不会复制或写入超出必要的字符数。类似的东西:
void
stringCopy( char* dest, int maxLength, char const* source )
{
assert( maxLength > 0 );
char* end = dest + maxLength - 1;
while ( dest != end && *source != '\0' ) {
*dest = *source;
++ dest;
++ source;
}
*dest = '\0';
}
(此功能实际上存在于C 2011的strcpy_s
名下,但是
它没有得到广泛实施;微软拥有它,但我没有看到它
其它地方。)
答案 3 :(得分:0)
strncpy()
份不超过length
个字符。在这样做时,未复制终止\0
。