C++入门自学Day7-- String类的使用(续)
往期内容回顾
String类(续)
String类(初识)
string类的操作(续)
string 类的一些常用操作函数的详细讲解,包含功能、语法以及示例代码,帮助你深入理解每个函数的用途。
1、c_str()
功能:
返回一个指向以 null 结尾的 C 风格字符串的指针(const char*),用于兼容 C 函数(如 printf, strlen, strcpy等)。
const char* c_str() const noexcept;
std::string str = "Hello"; printf("%s\n", str.c_str()); // 输出: Hello
int main(){string s("Hello world!\n");const char* ps = s.c_str();// printf("%s\n",ps);while(*ps){cout<< *ps << ' ';ps++;}cout << endl;cout << s << endl; //调用string类<<的重载cout << s.c_str()<<endl;//直接输出const char*; }
输出:
H e l l o w o r l d !
Hello world!Hello world!
int main(){string s("Hello world!\n");s += '\0';s += "world";cout << s << endl;cout << s.c_str()<<endl; }
输出描述:
Hello world!
world
Hello world!
cout << s << endl;
Hello world!\nworld!
std::cout 打印整个 string,包括中间的 '\0'
cout << s.c_str()
Hello world!\n
c_str() 返回的 C 字符串只到第一个 '\0'
注意:
s.c_str() 仍然只返回从头开始到第一个 '\0' 的部分,即 "Hello world!\n"。
2、利用find() 和 substr()寻找子字符串
🔍 函数简介
size_t find(const string& str, size_t pos = 0) const;
在调用字符串中查找 str 从 pos 开始出现的位置。
如果找不到,返回 string::npos。
string substr(size_t pos = 0, size_t len = npos) const;
从字符串的 pos 位置开始,截取长度为 len 的子串。
函数示例
int main(){string s("hello.cpp");size_t pos = s.find('.');if(pos != string::npos){string s2 = s.substr(pos);cout<< s2 <<endl;}else{cout<< "There is no suffix!"<<endl;} }
输出描述:
.cpp
利用find和substr分离网址
url = "https://cplusplus.com/reference/string/string/?kw=string#google_vignette"
每个网址都由三部分构成:1、协议 2、域名 3、资源名称
比如上面那个url就可以分离成下面三个:
协议: https 域名: cplusplus.com
资源名称 reference/string/string/?kw=string#google_vignette
利用find的代码实现:
void split_url(const string& str){size_t pos1 = str.find(':');if(pos1 != string::npos){cout<<str.substr(0,pos1)<<endl;}else{cout<<"wrong url"<<endl;}size_t pos2 = str.find('/',pos1+3);if(pos2 != string::npos){cout<<str.substr(pos1+3,pos2-pos1-3)<<endl;}else{cout<<"wrong url"<<endl;}cout<<str.substr(pos2)<<endl; };int main(){string s("https://cplusplus.com/reference/string/string/?kw=string#google_vignette");split_url(s); }
3、copy()
功能:
将字符串的一部分拷贝到字符数组中,不添加 \0 结尾!
size_t copy(char* s, size_t len, size_t pos = 0) const;
示例:
std::string str = "Hello, World!"; char buffer[6]; str.copy(buffer, 5, 7); // 从位置7拷贝5个字符到buffer buffer[5] = '\0'; // 手动添加结尾符 std::cout << buffer; // 输出: World
3、rfind()
功能:
查找字符串中最后一次出现的位置。
示例:
std::string str = "abcdefgabc"; std::cout << str.rfind("abc"); // 输出 7
4、compare()
功能:
比较字符串内容,返回值:
-
0 表示相等
-
>0表示当前参数字符串小
-
<0 表示参数字符串大
std::string a = "abc", b = "abd"; if (a.compare(b) < 0)std::cout << "a < b";
【面试oj题】
字符串最后一个单词的长度
对于给定的若干个单词组成的句子,每个单词均由大小写字母混合构成,单词间使用单个空格分隔。输出最后一个单词的长度。
输入描述:
在一行上输入若干个字符串,每个字符串代表一个单词,组成给定的句子。
除此之外,保证每个单词非空,由大小写字母混合构成,且总字符长度不超过 103103 。
输出描述:
在一行上输出一个整数,代表最后一个单词的长度。
代码实现:
#include <iostream> using namespace std;size_t get_length(const string& str) {size_t pos = str.rfind(' ');if (pos != 0) {return str.size() - pos - 1;} else {return str.size();} }int main(){string s;// cin>>s;getline(cin,s);cout<<get_length(s)<<endl;return 0; }
小结:这些函数的分类记忆
功能 | 函数名 |
---|---|
字符串获取 | c_str(), data() |
拷贝 | copy() |
查找 | find(), rfind(), find_first_of(), find_last_of(), find_first_not_of(), find_last_not_of() |
子串 | substr() |
比较 | compare() |