3

我有一个功能

ClassA::FuncA(const char *filePath)

并希望将此 const char string* 复制到 char*!

我的解决方案:

char *argv[2];
int length = strlen(filePath);
argv[1] = new char(length +1);
strncpy(argv[1], filePath, length); 

在此之后,我在 argv[1] 中有所需的字符,还有其他一些未定义的字符!

文件路径:

“C:\ Users \ Usera \parameter.xmlþîþÎþÎþÎþÎþÎþÎþÎþÎþÎþ”

这里有什么问题?带strlen的长度OK!

4

4 回答 4

16

像这样:

argv[1] = new char[length +1](); // () to value-initialize the array

你的版本:

argv[1] = new char(length +1);

仅分配一个char并将其值初始化为length+1.

于 2012-06-13T07:43:32.833 回答
1

您的代码中有两个问题:

  • 您需要在复制后将长度加 1 以复制空字符(因为 strlen 仅返回不带空字符的字符数;请参阅此处的更多信息)。所以将代码更改为:

    strncpy(argv[1], 文件路径, 长度 + 1);

  • 您需要修复数组的初始化方式,因为您只初始化一个字符(我们假设您希望复制完整的字符串)。所以:

    argv[1] = 新字符[长度 + 1]();


笔记:

  • 请在发布时也发布用于打印数据的代码,因为在很多情况下,此类问题取决于您调用打印数据的方式。
  • 最后,您可能会考虑仅使用一个固定大小的数组,该数组已初始化为最大路径。对于以下帖子中的 Windows 结帐中的最大路径大小
于 2012-06-13T07:55:40.510 回答
1

问题是您使用的是strncpy,而不是strcpy. 而且您使用它的方式,它不会复制终止的\0.

在实践中,因为strncpy可能会留下一个没有\0终止符的字符串,所以最好避免它。在您的情况下,strcpy单独使用就可以了,因为您刚刚分配了足够大的缓冲区。在更一般的情况下,您可能必须使用strlen, 以确保您拥有的字符串适合目标缓冲区(不要忘记将 1 添加到结果中,对于\0)。

如果这种情况经常发生,您可能想要编写自己的版本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';
}

(这个函数实际上存在,strcpy_s在 C 2011 中的名称下,但它没有被广泛实现;微软有它,但我在其他地方没有看到它。)

于 2012-06-13T08:21:38.953 回答
0

strncpy()复制不超过length字符。\0在这样做时,不会复制终止。

于 2012-06-13T07:45:23.377 回答