代码之家  ›  专栏  ›  技术社区  ›  asyncwait

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

  •  0
  • asyncwait  · 技术社区  · 15 年前

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

    char *str = "This is cool stuff";
    

    现在,我引用了如下的字符串指针,

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

    所以, start end 指向的不同位置 *str . 如何将字符串字符从开始到结束复制到新的字符串指针中。任何现有的C++/C功能都是可取的。

    7 回复  |  直到 15 年前
        1
  •  3
  •   Arkaitz Jimenez    15 年前

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

    char dest[end-start+1];
    strncpy(dest,start,end-start);
    dest[end-start] = '\0'
    
        2
  •  2
  •   Nikolai Fetissov    15 年前

    使用STL std::string :

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

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

        3
  •  0
  •   unwind    15 年前

    最好是用 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
  •   Alex Reynolds    15 年前

    如果你想用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
  •   Paul Tomblin    15 年前
    char newChar[] = new char[end-start+1]]
    p = newChar;
    while (start < end)
      *p++ = *start++;
    
        6
  •  0
  •   AnT stands with Russia    15 年前

    这是一种罕见的功能 strncpy 可以使用。只需计算需要复制的字符数,并在 Strncpy公司 . 记住 斯特朗普 在这种情况下,不会零终止结果,因此您必须自己完成(顺便说一句,这意味着使用它更有意义 memcpy 而不是几乎无用的 斯特朗普 )

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

        7
  •  0
  •   Michael Burr    15 年前

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

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

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

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