在C ++中从指针数组复制一些字符串

时间:2009-11-05 13:11:21

标签: c string pointers

我有一个像下面的字符串指针,

char *str = "This is cool stuff";

现在,我已经引用了这个字符串指针,如下所示,

char* start = str + 1;
char* end = str + 6;

因此,startend指向*str的不同位置。如何将字符串字符在开始和结束之间复制到新的字符串指针中。任何现有的C ++ / C函数都是可取的。

7 个答案:

答案 0 :(得分:3)

只需创建一个名为dest的新缓冲区并使用strncpy

char dest[end-start+1];
strncpy(dest,start,end-start);
dest[end-start] = '\0'

答案 1 :(得分:2)

使用STL std::string


#include 
const char *str = "This is cool stuff";
std::string part( str + 1, str + 6 );

这使用迭代器范围构造函数,因此C字符串的一部分不必以零终止。

答案 2 :(得分:0)

char newChar[] = new char[end-start+1]]
p = newChar;
while (start < end)
  *p++ = *start++;

答案 3 :(得分:0)

最好使用strcpy()执行此操作,并自行终止结果。标准strncpy()函数具有非常奇怪的语义。

如果你真的想要一个“新的字符串指针”,并且在长度和静态缓冲区方面有点安全,你需要动态分配新的字符串:

char * ranged_copy(const char *start, const char *end)
{
  char *s;

  s = malloc(end - start + 1);
  memcpy(s, start, end - start);
  s[end - start] = 0;

  return s;
}

答案 4 :(得分:0)

如果您想使用C ++ STL执行此操作:

#include <string>
...
std::string cppStr (str, 1, 6); // copy substring range from 1st to 6th character of *str
const char *newStr = cppStr.c_str(); // make new char* from substring

答案 5 :(得分:0)

这是可以使用函数strncpy的极少数情况之一。只需计算需要复制的字符数,并在strncpy中指定确切的数量。请记住strncpy在这种情况下不会将结果归零,因此您必须自己完成(BTW,这意味着使用memcpy更有意义而不是实际无用strncpy)。

请为自己帮忙,开始使用带有字符串文字的const char *指针。

答案 6 :(得分:0)

假设end遵循指向刚要复制的最后一个项目的惯用语义(即使我们处理直接C,STL语义也是一个有用的习惯用法)并且已知目标缓冲区具有足够的空间:

memcpy( buf, start, end-start);
buf[end-start] = '\0';

我将它包装在一个子字符串函数中,该函数也将目标缓冲区大小作为参数,因此它可以执行检查并截断结果或返回错误以防止超出。

我会避免使用strncpy()因为太多的程序员忘记了它可能不会终止目标字符串这一事实,所以第二行可能会被某些人认为不必要地错误地丢弃。如果使用memcpy(),则不太可能。 (一般情况下,只要拒绝使用strncpy()