📜  char * vs std:C++中的字符串 vs char []

📅  最后修改于: 2021-05-30 13:52:31             🧑  作者: Mango

在本文中,我们将研究在C++中初始化字符串的三种不同方法,并讨论它们之间的区别。

1.使用char *

在这里,str基本上是指向(const)字符串字面量的指针。
句法:

char* str = "This is GeeksForGeeks";

优点:

  1. 引用整个字符串只需要一个指针。这表明这是高效的内存。
  2. 无需事先声明字符串的大小。
// CPP program to illustrate *char
#include 
using namespace std;
  
int main()
{
    // pointer str points to const string literal "Hello".
    // No need to declare size.
    char* str1 = "This is GeeksForGeeks";
  
    cout << str1 << endl;
  
    int size = 30;
  
    // can allocate size dynamically.
    char* str2 = (char*)malloc(sizeof(char) * size);
  
    str2 = "GeeksForGeeks For Everyone";
  
    cout << str2;
  
    return 0;
}

输出:

This is GeeksForGeeks
GeeksForGeeks For Everyone

缺点:

  1. 这在C语言中可以正常工作,但是在C++中以这种形式编写并不是一个好主意。这就是为什么编译器显示警告
    “不建议从字符串常量转换为’char *’”的原因,因为在C中,字符串字面量是char数组,但是
    在C++中,它们是char的常量数组。因此,在char *之前使用const关键字。
    const char* str = "This is GeeksForGeeks";
  2. 我们无法在程序的后期修改字符串。我们可以将str更改为指向其他内容,但是不能更改str上存在的值。有关更多详细信息,请参见C中的字符串存储。
    // CPP program to illustrate assigning
    // *char value to other variable 
    #include 
    using namespace std;
      
    int main()
    {
        // This initialization gives warning in C++.
        // "deprecated conversion from string constant
        // to 'char*'"
        char* str = "Hello";
      
        const char* str1 = "Hello"; // No warning
      
        // trying to modify const string literal
        // gives Runtime error
        str[1] = 'o';
      
        cout << str << endl;
      
        return 0;
    }
    

    输出:

    Segmentation Fault

2.使用std ::字符串

句法:

std::string str = "This is GeeksForGeeks";

此处的str是std :: 字符串类的对象,它是basic_string类模板的实例,该模板使用char(即字节)作为其字符类型。

注意:不要使用为c_string字符串.H功能,当你宣称字符串的std :: 字符串关键字,因为的std :: 字符串字符串是basic_string的类类型和为c_string字符串为const char *类型的。
优点:
当专门处理C++ std: 字符串,因为更好的搜索,替换和操作功能,它是最好的选择。
下面讨论了一些有用的std:字符串函数。

// CPP program to illustrate 
// std::string functions
#include 
using namespace std;
  
int main()
{
    // string assignment
    string s1 = "Hello";
    string s2 = "World";
  
    // return length of string
    cout << s1.size() << endl; // 5
    cout << s2.length() << endl; // 5
  
    // concatenate string using + operator.
    s1 = s1 + s2;
    cout << s1 << endl; // HelloWorld
  
    // append string
    s1.append("Geeks");
    cout << s1 << endl; // HelloWorldGeeks
  
    string s3 = "HelloWorldGeeks";
  
    // compare two strings
    if (s1.compare(s3) == 0)
        cout << "true" << endl;
    else
        cout << "false" << endl;
  
    // substring of string s1
    // substr(pos, length_of_substring)
    string sub = s1.substr(0, 5);
    cout << sub << endl; // Hello
  
    // insert into string
    // insert(pos, string)
    s1.insert(10, "For");
    cout << s1 << endl; // HelloWorldForGeeks
  
    string target = "World";
  
    // find a target string in s1
    size_t pos = s1.find(target);
    if (pos != std::string::npos) // npos=-1
        cout << "Found at Position:" << pos << endl; // pos=5
  
    // replace a portion of string s1
    // replace(pos, length_of_portion, string_to_replace)
    cout << s1.replace(5, 5, "Geeks") << endl; // HelloGeeksForGeeks
  
    return 0;
}

输出:

5
5
HelloWorld
HelloWorldGeeks
true
Hello
HelloWorldForGeeks
Found at Position:5
HelloGeeksForGeeks

您可能更喜欢char *而不是std: 字符串

  1. 处理低级访问(例如与操作系统对话)时,但是通常,如果要将字符串传递给
    然后操作系统std :: 字符串:: c_str覆盖了它。
  2. 与旧C代码的兼容性(尽管std :: string的c_str()方法可以处理大部分内容)。
  3. 为了节省内存(std ::字符串可能会有更多开销)。

3.使用char []

句法:

char str[] = "This is GeeksForGeeks";
     or 
char str[size] = "This is GeeksForGeeks";
//  Here str is a array of characters denoting the string.

优点:

  1. 我们可以在程序的稍后阶段修改字符串。
// CPP program to illustrate char
#include 
using namespace std;
  
int main()
{
  
    char str[] = "Hello";
    // or char str1[]={'H', 'e', 'l', 'l', 'o', '\0'};
  
    // modify string to "Hollo"
    str[1] = 'o';
  
    cout << str << endl;
  
    return 0;
}

输出:

Hollo

缺点:

  1. 这是静态分配大小的数组,占用堆栈空间。
  2. 我们需要的,如果我们想连接或与其他字符串操作,因为字符串的大小是固定的取阵列的大尺寸。为此,我们可以使用C++标准库cstring字符串.h
    // CPP program to illustrate char
    // concatenation using standard functions
    #include 
    #include 
    using namespace std;
      
    int main()
    {
        // take large size of array
        char str[10] = "Hello";
      
        cout << "Before Concatenation : " << str << endl; // Hello
        strcat(str, " World");
        cout << "After Concatenation : " << str; // Hello World
      
        return 0;
    }
    

    输出:

    Before Concatenation : Hello
    After Concatenation : Hello World
    

这是C++标准库cstring的其他几个有用功能。

#include 
#include 
using namespace std;
  
int main()
{
    char s1[10] = "Hello";
  
    // return length of s1
    cout << strlen(s1) << endl;
  
    char s2[50];
  
    // copies s1 into s2
    strcpy(s2, s1);
    cout << s2 << endl;
  
    char s3[10] = "World";
  
    // concatenates s3 into s2
    strcat(s2, s3);
    cout << s2 << endl;
  
    char s4[50] = "HelloWorld";
  
    // return 0 if s2 and s4 are equal.
    if (strcmp(s2, s4) == 0)
        cout << "true" << endl;
    else
        cout << "false" << endl;
  
    char s5[30];
  
    // copies first 5 chars of s2 into s1
    strncpy(s5, s4, 5);
    cout << s5 << endl;
  
    char target[10] = "Hello";
  
    // search for target string in s4
    if (strstr(s4, target) != NULL)
        cout << "true" << endl;
    else
        cout << "false" << endl;
  
    return 0;
}

输出 :

5
Hello
HelloWorld
true
Hello
true
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”