2009-11-05 37 views
0

我有一个字符串指针像下面,复制从指针数组一些C字符串++

char *str = "This is cool stuff"; 

现在,我已经引用到这个字符串的指针像下面,

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

所以,startend指向*str的不同位置。我怎样才能将开始和结束之间的字符串字符复制到一个新的字符串指针。任何现有的C++/C函数都是可取的。

+0

这是'c',而不是'C++',在'C++'中,可以使用字符串类或数组类(I HOPE)。 – 2009-11-05 13:18:09

回答

3

只需创建一个新的缓冲称为蒸馏水和使用strncpy()函数

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

为什么选择Kaboom? 256有什么魔力? – jmucchiello 2009-11-05 13:19:04

+0

以前它是“dest [256]” – foraidt 2009-11-05 13:20:37

+0

请记住,如果在'start'和'end'之间有'\ 0'字符,复制将在那里停止。 – ndim 2009-11-05 13:43:01

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

您的字符串名称有一个保留字,并且没有删除[]。 – 2009-11-05 13:25:41

+0

与Arkaitz Jimenez的解决方案相比,有点复杂。 另外,是不是'新'一个不能用作变量名称的受保护关键字?不对VC9进行协同处理。 – foraidt 2009-11-05 13:26:04

+0

@Sid,如果你删除它,那么你不再有字符串。 – 2009-11-05 13:32:42

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; 
} 
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 
2

使用STL std::string


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

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

0

这是功能strncpy可以使用的罕见情况之一。只需计算您需要复制的字符数并在strncpy中指定确切的金额即可。请记住,在这种情况下,strncpy不会零终止结果,因此您必须自己执行此操作(顺便说一下,这意味着使用memcpy而非几乎无用的strncpy更合理)。

而且请你自己帮忙,开始用const char *指针和字符串文字。

0

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

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

我在子字符串函数也采取了目标缓冲区的大小作为参数,因此它可以进行检查,并截断结果或返回一个错误,以防止超支这个包起来。

我会避免使用strncpy(),因为太多的程序员会忘记它可能不会终止目标字符串的事实,所以第二行可能会被某些人认为是不必要的,从而被错误地放弃。如果使用memcpy(),那么可能性较小。(一般来说,只是拒绝使用strncpy()