【问题标题】:Copying some strings from pointer array in C++从 C++ 中的指针数组复制一些字符串
【发布时间】:2009-11-05 13:11:20
【问题描述】:

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

char *str = "This is cool stuff";

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

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

所以,startend 指向 *str 的不同位置。如何将开始和结束之间的字符串字符复制到新的字符串指针中。最好使用任何现有的 C++/C 函数。

【问题讨论】:

  • 这是 'c',不是 'c++',在 'c++' 中可以使用字符串类或数组类(我希望)。

标签: c string pointers


【解决方案1】:

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

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

【讨论】:

  • 以前是“dest[256]”
  • 请记住,如果在startend 之间的某个位置存在\0 字符,则复制将停在那里。
  • @ndim - 我们已经确定 start 和 end 是 C 字符串中的指针,因此除了结尾之外的任何地方都不能有 0 字节。
【解决方案2】:

使用 STL std::string:


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

这使用了 iterator range 构造函数,因此 C 字符串的部分不必以零结尾。

【讨论】:

    【解决方案3】:

    最好使用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】:

      如果你想用 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】:
        char newChar[] = new char[end-start+1]]
        p = newChar;
        while (start < end)
          *p++ = *start++;
        

        【讨论】:

        • 您的字符串名称有一个保留字,并且没有 delete[]。
        • 与 Arkaitz Jimenez 的解决方案相比有点复杂。另外,“new”不是不能用作变量名的受保护关键字吗?不能在 VC9 上编译。
        • @Sid,如果你删除它,那么你就没有这个字符串了。
        • @Paul,我认为@Sid 他的意思是当你完成了你需要删除[]它的字符串另外,没有检查 end > start,所以如果是这样,你可能会遇到问题案子。在这个简单的示例中,结束是 > 开始,但最好检查更通用的代码。
        • @pxb,一旦你完成它,你总是必须删除它。问题不在于变量的整个生命周期,而在于如何创建它。
        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

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

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

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

          【讨论】:

            猜你喜欢
            • 2018-01-18
            • 2021-06-28
            • 2020-11-04
            • 2011-03-13
            • 1970-01-01
            • 1970-01-01
            • 2012-02-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多