2012-06-13 74 views
2

我有一个函数C++复制为const char *为char *

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]所需的字符,而且其他一些不确定的字符!

文件路径:

“C:\用户\用户A \Parameter.xmlþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþKŸQyá•”

请告诉我错在这里?用strlen的长度是可以的!

回答

14

像这样:

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

您的版本:

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

只分配一个char和它的价值初始化为length+1

+0

'argv [1] = new char [length + 1]; strncpy(argv [1],filePath,length + 1);'可能会更快更大的长度?!好吧,在大多数情况下,我猜想没关系。 – smerlin

+0

@smerlin什么? –

+0

我按了一个换行符输入...以及在注释中不起作用,所以我的不完整的评论第二次可见。你要快! – smerlin

0

strncpy()副本不超过length个字符。这样做,终止\0未被复制。

1

你在你的代码的两个问题:

  • 你需要以复制空字符复制后加1到长度(如strlen的回报只有数个字符的无空字符;看到更多here) 。因此,将代码更改为:

    strncpy(argv [1],filePath,length + 1);

  • 你需要修复你的数组是如何初始化的,因为你只初始化一个字符(并且我们假设你想要完整的字符串被复制)。所以:

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


注:

  • 请当你帖子还张贴了用来打印出数据,此类问题在很多情况下的代码依赖于你打电话打印出什么数据。
  • 最后,你可能会考虑只使用一个初始化为最大路径的固定大小的数组。在Windows结账最大路径大小以下post
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,但 它没有广泛实施;微软有它,但我从来没见过它 其他地方)