我有一个像下面的字符串指针,
char *str = "This is cool stuff";
现在,我已经引用了这个字符串指针,如下所示,
char* start = str + 1;
char* end = str + 6;
因此,start
和end
指向*str
的不同位置。如何将字符串字符在开始和结束之间复制到新的字符串指针中。任何现有的C ++ / C函数都是可取的。
答案 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()
)