在本文中,我们将研究在C++中初始化字符串的三种不同方法,并讨论它们之间的区别。
1.使用char *
在这里,str基本上是指向(const)字符串字面量的指针。
句法:
char* str = "This is GeeksForGeeks";
优点:
- 引用整个字符串只需要一个指针。这表明这是高效的内存。
- 无需事先声明字符串的大小。
// 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
缺点:
- 这在C语言中可以正常工作,但是在C++中以这种形式编写并不是一个好主意。这就是为什么编译器显示警告
“不建议从字符串常量转换为’char *’”的原因,因为在C中,字符串字面量是char数组,但是
在C++中,它们是char的常量数组。因此,在char *之前使用const关键字。const char* str = "This is GeeksForGeeks";
- 我们无法在程序的后期修改字符串。我们可以将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: 字符串
- 处理低级访问(例如与操作系统对话)时,但是通常,如果要将字符串传递给
然后操作系统std :: 字符串:: c_str覆盖了它。 - 与旧C代码的兼容性(尽管std :: string的c_str()方法可以处理大部分内容)。
- 为了节省内存(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.
优点:
- 我们可以在程序的稍后阶段修改字符串。
// 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
缺点:
- 这是静态分配大小的数组,占用堆栈空间。
- 我们需要的,如果我们想连接或与其他字符串操作,因为字符串的大小是固定的取阵列的大尺寸。为此,我们可以使用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等的更多准备工作,请参阅“完整面试准备课程” 。