C ++将const char *复制到char *

时间:2012-06-13 07:40:28

标签: c++ char strncpy

我有一个功能

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的长度还可以!

4 个答案:

答案 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]();


注意:

  • 请在发布时也发布用于打印数据的代码,因为在很多情况下这些问题取决于您打算输出的数据。
  • 最后,您可以考虑使用一个固定大小的数组,该数组已初始化为最大路径。对于post
  • 之后的Windows结帐中的最大路径大小

答案 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