【问题标题】:whats the difference between C strings and C++ strings?C字符串和C++字符串有什么区别?
【发布时间】:2010-08-11 02:41:56
【问题描述】:

C 字符串和 C++ 字符串有什么区别。特别是在进行动态内存分配时

【问题讨论】:

  • 你是指两种语言中使用char*char[]字符串的区别,还是基于char的字符串和std::string的区别?
  • 请定义“C 字符串”和“C++ 字符串”的含义。两者(尤其是后者)都是模棱两可的。
  • 我想不出他们可能有的共同点。我得睡着了。
  • @Gollum,这可能是一个实现问题。我认为标准中没有任何内容可以说明 C++ 字符串不允许 以空值结尾。事实上,它可能会让c_str 更容易实现。
  • 我认为它们通常是 nul 终止的,以便在调用 c_str() 时节省创建临时缓冲区

标签: c++ c string


【解决方案1】:

我几乎不知道从哪里开始 :-)

在 C 中,字符串只是 char 数组,按照惯例,它以 NUL 字节结尾。在动态内存管理方面,您可以简单地malloc 为它们分配空间(包括额外的字节)。修改字符串时的内存管理是您的责任:

char *s = strdup ("Hello");
char *s2 = malloc (strlen (s) + 6);
strcpy (s2, s);
strcat (s2, ", Pax");
free (s);
s = s2;

在 C++ 中,字符串 (std::string) 是具有所有相关自动内存管理和控制的对象,这使得它们更安全、更易于使用,尤其是对于新手而言。对于动态分配,使用类似:

std::string s = "Hello";
s += ", Pax";

我知道我更喜欢使用哪个,后者。您可以(如果需要)始终使用c_str() 方法从std::string 构造一个C 字符串。

【讨论】:

    【解决方案2】:

    C++ 字符串更安全、更简单,并且它们支持不同的字符串操作功能,如追加、查找、复制、连接等。

    通过以下示例说明 c 字符串和 c++ 字符串之间的一个有趣区别

    #include <iostream>                            
    using namespace std;
    
    int main() {
        char a[6]; //c string
        a[5]='y';
        a[3]='o';
        a[2]='b';
        cout<<a; 
        return 0;
    }
    

    输出»¿boRy¤£f·Pi»¿

    #include <iostream> 
    using namespace std; 
    int main() 
    { 
      string a; //c++ string
      a.resize(6);
      a[5]='y';
      a[3]='o';
      a[2]='b';
      cout<<a;
      return 0;
    }
    

    输出男孩

    希望你明白了!

    【讨论】:

    • 这种来自 C 的行为是导致像 Heartbleed 这样的错误的原因。
    【解决方案3】:

    不同之处在于某些操作的速度,以及常见错误发生的地方的封装。 std::string 维护有关字符串内容和长度的信息。这意味着它不像 const char * 那样容易发生缓冲区溢出。对于大多数操作,它也比 const char * 更快,因为字符串的长度是已知的。 大多数 cstring 操作都会在后台调用 strlen() 以在对其进行操作之前找出字符串的长度,这会降低性能。 std::string 与 STL 算法和其他容器兼容。

    最后,std::string 没有相同的“陷阱!” char * 将具有的时刻:

    【讨论】:

    • C 字符串不是char *const char *;它们只是以空字符结尾的字符数组。甚至字符串文字也只是字符数组。
    猜你喜欢
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 2012-10-10
    • 2011-01-15
    相关资源
    最近更新 更多