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

从C+中的指针数组复制一些字符串+;,c,string,pointers,C,String,Pointers,我有一个字符串指针,如下所示 char *str = "This is cool stuff"; char* start = str + 1; char* end = str + 6; 现在,我引用了下面这个字符串指针 char *str = "This is cool stuff"; char* start = str + 1; char* end = str + 6; 因此,start和end指向*str的不同位置。如何将介于开始和结束之间的字符串字符复制到新的字符串指针中。任何现有

我有一个字符串指针,如下所示

char *str = "This is cool stuff";
char* start = str + 1;
char* end = str + 6;
现在,我引用了下面这个字符串指针

char *str = "This is cool stuff";
char* start = str + 1;
char* end = str + 6;

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

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

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

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

char dest[end-start+1];
strncpy(dest,start,end-start);
dest[end-start] = '\0'
char newChar[]=新字符[结束-开始+1]]
p=newChar;
while(开始<结束)
*p++=*开始++;
char newChar[]=新字符[结束-开始+1]]
p=newChar;
while(开始<结束)
*p++=*开始++;

最好使用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;
}

最好使用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;
}

如果你想用C++ STL:< /P>

#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
#包括
...
std::字符串cppStr(str,1,6);//复制*str的第1到第6个字符的子字符串范围
const char*newStr=cppStr.c_str();//从子字符串生成新字符*

< /代码> 如果您想用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
#包括
...
std::字符串cppStr(str,1,6);//复制*str的第1到第6个字符的子字符串范围
const char*newStr=cppStr.c_str();//从子字符串生成新字符*

使用STL
std::string


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

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

使用STL
std::string


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

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

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


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

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


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

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

memcpy( buf, start, end-start);
buf[end-start] = '\0';
我将它包装在一个子字符串函数中,该函数也将目标缓冲区大小作为参数,以便它可以执行检查并截断结果或返回错误以防止溢出


我会避免使用
strncpy()
,因为太多程序员忘记了它可能不会终止目标字符串这一事实,因此第二行可能会在某个时候被认为不必要的人错误地删除。如果使用
memcpy()
,则不太可能出现这种情况。(一般来说,只需拒绝使用
strncpy()

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

memcpy( buf, start, end-start);
buf[end-start] = '\0';
我将它包装在一个子字符串函数中,该函数也将目标缓冲区大小作为参数,以便它可以执行检查并截断结果或返回错误以防止溢出


我会避免使用
strncpy()
,因为太多程序员忘记了它可能不会终止目标字符串这一事实,因此第二行可能会在某个时候被认为不必要的人错误地删除。如果使用
memcpy()
,则不太可能出现这种情况。(一般来说,只要说不使用strncpy())

这是“c”,而不是“c++”,在“c++”中可以使用字符串类或数组类(我希望如此)。这是“c”,而不是“c++”,在“c++”中可以使用字符串类或数组类(我希望如此)。以前它是“dest[256]”请记住,如果在
开始
结束
之间的某个地方有一个
\0
字符,复制将停止。@ndim-我们已经确定开始和结束是C字符串中的指针,因此除了结尾之外,任何地方都不能有0字节。以前它是“dest[256]”请记住,如果在
开始
结束
之间有一个
\0
字符,复制将停止。@ndim-我们已经确定开始和结束是C字符串中的指针,因此,除了结尾之外,任何地方都不能有0字节。您的字符串名有一个保留字,并且没有删除[]。与Arkaitz Jimenez的解决方案相比有点复杂。另外,“new”不是一个不能用作变量名的受保护关键字吗?不在VC9上进行copmpile。@Sid,如果删除它,则不再具有该字符串@