文章目录
前言
在本文中,我将介绍C++中常用的字符串函数stoi()、atoi()、to_string()等等,并提供一些实用的代码案例和使用建议。不管说是平时使用还是说做算法题时,都可以很好的提高我们编程的效率。在最后,还准备了一些和字符串函数相关的算法题目,这也是平时比较常见的算法题。
一、字符串转数字—stoi()
在C++中,stoi()
函数是将字符串转换为整数的函数,其作用是将一个字符串类型的数字转换为一个整数类型的数字。
stoi()
函数的原型如下:
int stoi(const string& str, size_t* pos = 0, int base = 10);
其中,str
是要转换的字符串,pos
是一个指向size_t
类型的指针,用于存储转换过程中第一个无法转换的字符的位置,base
表示要转换的进制数,默认为10进制。
stoi()
函数会从字符串的开头开始读取数字字符,直到遇到第一个非数字字符为止,然后将读取到的数字字符转换为整数类型的数字。如果字符串的开头不是数字字符,则返回0。
例如,stoi("123")
的返回值为整数类型的123。
需要注意的是,如果字符串中包含非数字字符,stoi()
函数会抛出invalid_argument
异常,如果转换后的结果超出了整数类型的范围,stoi()
函数会抛出out_of_range
异常。因此,在使用stoi()
函数时,应该对异常进行处理。
二、字符串转数字—atoi()
在C++中,atoi()
函数是将字符串转换为整数的函数,其作用与stoi()
函数类似,不同之处在于atoi()
函数是C语言中的函数,而stoi()
函数是C++11中新增的函数。
atoi()
函数的原型如下:
int atoi(const char* str);
其中,str
是要转换的字符串,必须是以null结尾的字符串。
atoi()
函数会从字符串的开头开始读取数字字符,直到遇到第一个非数字字符为止,然后将读取到的数字字符转换为整数类型的数字。如果字符串的开头不是数字字符,则返回0。
例如,atoi("123")
的返回值为整数类型的123。
需要注意的是,如果字符串中包含非数字字符,atoi()
函数会将其忽略,并返回已经读取到的数字字符组成的整数。因此,如果字符串中包含无法转换的字符,atoi()
函数的返回值可能不是我们期望的结果。
另外,atoi()
函数不会对转换后的结果进行范围检查,如果转换后的结果超出了整数类型的范围,则结果是未定义的。因此,在使用atoi()
函数时,应该对字符串的内容进行检查,以避免出现错误。
三、数字转字符串—to_string()
在C++中,to_string()
函数是将数字转换为字符串的函数,其作用是将一个数字类型的变量转换为字符串类型的变量。
to_string()
函数的原型如下:
string to_string(int val);
string to_string(long val);
string to_string(long long val);
string to_string(unsigned val);
string to_string(unsigned long val);
string to_string(unsigned long long val);
string to_string(float val);
string to_string(double val);
string to_string(long double val);
其中,val
是要转换的数字。
to_string()
函数会将数字转换为字符串类型的变量,并返回这个字符串类型的变量。例如,to_string(123)
的返回值为字符串类型的"123"。
需要注意的是,to_string()
函数只能将数字类型的变量转换为字符串类型的变量,如果要将其他类型的变量转换为字符串类型的变量,需要使用其他的方法。
四、字符串截取—substr()
substr()
是C++标准库中的一个成员函数,可用于从一个字符串中提取子串。它的语法如下:
std::string substr (size_t pos, size_t len) const;
其中,pos
参数指定了子串的起始位置,len
参数指定了子串的长度。该函数返回从当前字符串中的pos
位置开始,长度为len
的子串。
下面是一个使用substr()
函数的示例代码:
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, world!";
std::string sub1 = str.substr(0, 5); // 从0位置开始,长度为5的子串
std::string sub2 = str.substr(7, 5); // 从7位置开始,长度为5的子串
std::string sub3 = str.substr(7); // 从7位置开始,到字符串末尾的子串
std::cout << sub1 << std::endl; // 输出 "Hello"
std::cout << sub2 << std::endl; // 输出 "world"
std::cout << sub3 << std::endl; // 输出 "world!"
return 0;
}
在上述示例代码中,我们首先定义了一个字符串str
,并将其赋值为"Hello, world!"
。然后,我们使用substr()
函数从str
中提取了三个子串,分别是从0位置开始,长度为5的子串、从7位置开始,长度为5的子串,以及从7位置开始,到字符串末尾的子串。最后,我们将这些子串输出到屏幕上,以验证substr()
函数的正确性。
需要注意的是,substr()
函数返回的是一个新的字符串对象,而不是原始字符串的一个子串。因此,在使用substr()
函数时,应该将结果存储到一个新的字符串对象中,以便后续使用。
五、字符串转为字符—str[i]、str.at(i)
在C++中,可以使用字符串的下标运算符[]
或者at()
函数获取字符串中的某个字符。这两种方法都可以将字符串中的某个字符转换为字符类型的变量。
下面是一个示例代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str = "hello";
char ch;
ch = str[0]; // 使用下标运算符获取字符串中的第一个字符
cout << "使用下标运算符获取的字符为:" << ch << endl;
ch = str.at(3); // 使用at()函数获取字符串中的第四个字符
cout << "使用at()函数获取的字符为:" << ch << endl;
return 0;
}
在上面的代码中,我们首先定义了一个字符串str
,然后使用下标运算符[]
和at()
函数分别获取了字符串中的第一个字符和第四个字符,并将其转换为字符类型的变量ch
。最后,我们输出了这两个字符。
需要注意的是,如果使用下标运算符[]
获取字符串中的某个字符,应该确保下标的值在字符串的有效范围内,否则可能会导致程序崩溃。如果使用at()
函数获取字符串中的某个字符,则在下标越界时会抛出out_of_range
异常,因此,使用at()
函数可以更加安全。
六、字符串流类—stringstream
stringstream是输入输出流对象。
用于:
1.数据类型转换
2.字符串拼接
3.分割字符串 stringstream默认遇到空格、tab、回车换行会停止字节流输出。
在C++中,stringstream
是一个字符串流类,可以将字符串转换为数字、字符等基本数据类型。下面是一个简单的示例代码:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main() {
string str = "123 456 789";
stringstream ss(str); // 定义一个字符串流
int num;
while (ss >> num) { // 逐个读取每个整数
cout << num << endl;
}
return 0;
}
在上述示例代码中,我们首先定义了一个字符串str
,然后使用stringstream
将其转换为字符串流ss
。在循环中,我们使用>>
运算符逐个读取每个整数,并输出到屏幕上。
由于遇到空格、tab、回车换行,所以输出结果为 :
123
456
789
除了读取整数,stringstream
还可以读取其他基本数据类型。例如,如果要读取一个浮点数,可以将int
改为float
或double
。如果要读取一个字符,可以将int
改为char
。如果要读取一个字符串,可以使用getline()
函数。
另外,stringstream
还可以将基本数据类型转换为字符串。例如,可以使用<<
运算符将一个整数转换为字符串。下面是一个示例代码:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main() {
int num = 123;
stringstream ss;
ss << num; // 将整数转换为字符串
string str;
ss >> str; // 将字符串读取到变量中
cout << str << endl;
return 0;
}
在上述示例代码中,我们首先定义了一个整数num
,然后使用stringstream
将其转换为字符串流ss
。在将整数转换为字符串后,我们使用>>
运算符将其读取到字符串变量str
中,并输出到屏幕上。
七、将字符转为小写—tolower()
tolower()
是C++标准库中的一个函数,其作用是将一个字符转换为小写字母。它的语法如下:
int tolower(int c);
其中,c
参数是一个整数,它代表一个字符的ASCII码值。如果该字符是大写字母,则tolower()
函数将其转换为相应的小写字母;否则,tolower()
函数将返回原始字符的ASCII码值。
下面是一个使用tolower()
函数的示例代码:
#include <iostream>
#include <ctype.h>
int main() {
char c = 'A';
char d = 'a';
std::cout << tolower(c) << std::endl; // 输出 97,即字符 'a' 的ASCII码值
std::cout << tolower(d) << std::endl; // 输出 97,即字符 'a' 的ASCII码值
return 0;
}
在上述示例代码中,我们首先定义了两个字符变量c
和d
,分别赋值为大写字母'A'
和小写字母'a'
。然后,我们使用tolower()
函数将这两个字符转换为小写字母,并将结果输出到屏幕上。可以看到,tolower()
函数将大写字母'A'
转换为小写字母'a'
,并将小写字母'a'
转换为小写字母'a'
,这是因为小写字母经过tolower()
函数的转换后不会发生变化。
需要注意的是,tolower()
函数只能将一个字符转换为小写字母,而不能将一个字符串全部转换为小写字母。如果需要将一个字符串全部转换为小写字母,可以使用std::transform()
函数结合tolower()
函数来实现。
八、读取一行输入—getline()
getline()
是C++标准库中的一个函数,用于从输入流中读取一行字符串。它的语法如下:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main() {
string input1, input2;
getline(cin, input1);
getline(cin, input2);
cout << input1 << endl;
cout << input2 << endl;
return 0;
}
九、visio studio代码提示按键
Alt+→
十、求出字符串中字符的个数(不允许重复)
这道题可以使用C++的STL标准库中的set
容器来实现。具体步骤如下:
- 定义一个空的
set
容器,用于存储出现过的字符。 - 遍历字符串中的每个字符,将其加入
set
容器中。 - 返回
set
容器的大小,即为没有重复的字符个数。
下面是用C++实现上述算法的代码:
#include <iostream>
#include <set>
using namespace std;
int countUniqueChars(string str) {
set<char> charSet;
// 将每个字符添加到set中
for (char c : str) {
charSet.insert(c);
}
return charSet.size();
}
int main() {
string str = "hello world";
int count = countUniqueChars(str);
cout << "The number of unique characters in \"" << str << "\" is: " << count << endl;
return 0;
}
十一、求出字符串中没有重复的字符的个数
要找出一个字符串中没有重复的字符个数,可以使用哈希表来实现。具体步骤如下:
- 定义一个哈希表,用于存储每个字符出现的次数。
- 遍历字符串中的每个字符,将其对应的哈希表中的值加1。
- 再次遍历字符串中的每个字符,查找其在哈希表中的值,如果为1,则说明该字符只出现了一次,将计数器加1。
- 返回计数器的值,即为没有重复的字符个数。
下面是用C++实现上述算法的代码:
#include <iostream>
#include <unordered_map>
using namespace std;
int countUniqueChars(string str) {
unordered_map<char, int> charCount;
// 统计每个字符出现的次数
for (char c : str) {
charCount[c]++;
}
int uniqueCount = 0;
// 查找没有重复的字符个数
for (char c : str) {
if (charCount[c] == 1) {
uniqueCount++;
}
}
return uniqueCount;
}
int main() {
string str = "hello world";
int count = countUniqueChars(str);
cout << "The number of unique characters in \"" << str << "\" is: " << count << endl;
return 0;
}
十二、求字符串中字符a-z(不允许重复)的个数
要找出字符串中a-z字符的不重复个数,可以使用一个set
容器来存储字符串中出现过的字符,因为set
容器中不允许出现重复的元素。具体步骤如下:
- 定义一个空的
set
容器,用于存储字符串中出现过的字符。 - 遍历字符串中的每个字符,将其加入
set
容器中。 - 返回
set
容器的大小,即为不重复字符的个数。
下面是用C++实现上述算法的代码:
#include <iostream>
#include <string>
#include <set>
using namespace std;
int countUniqueChars(string str) {
set<char> charSet;
// 遍历字符串中的每个字符,将其加入set容器中
for (char c : str) {
if (c >= 'a' && c <= 'z') { // 只统计a-z之间的字符
charSet.insert(c);
}
}
return charSet.size();
}
int main() {
string str = "hello world";
int count = countUniqueChars(str);
cout << "The number of unique characters in \"" << str << "\" is: " << count << endl;
return 0;
}
十三、输入一个任意长度和任意内容的数组,例如[1,2,3,4]或[1,2,5]等等,将数组的内容放到vector容器中,并输出。
如果要在C++中输入一个带括号的数组,可以使用字符串流(stringstream)和vector容器来实现。下面是一个示例代码:
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
int main() {
string str;
cout << "Enter an array: ";
getline(cin, str); // 读入带括号的字符串
vector<int> v;
stringstream ss(str.substr(1, str.size() - 2)); // 去除字符串的首尾括号
int num;
char ch;
while (ss >> num) {
v.push_back(num); // 逐个读入每个元素
ss >> ch; // 读入逗号
}
cout << "The vector is: ";
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " "; // 输出vector数组中的每个元素
}
cout << endl;
return 0;
}
在上述示例代码中,我们首先使用getline()
函数读入带括号的字符串,然后使用字符串流(stringstream)将字符串转换为整数,并将其逐个添加到vector
数组中。在读入整数后,我们还需要读入逗号,以便读取下一个整数。最后输出vector
数组中的每个元素。
在运行程序时,需要输入一个带括号的数组,例如[1, 2, 3, 4]
,程序会将其转换为vector
数组并输出。