c++中字符串相关的函数及其使用场景

前言

在本文中,我将介绍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改为floatdouble。如果要读取一个字符,可以将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;
}

在上述示例代码中,我们首先定义了两个字符变量cd,分别赋值为大写字母'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容器来实现。具体步骤如下:

  1. 定义一个空的set容器,用于存储出现过的字符。
  2. 遍历字符串中的每个字符,将其加入set容器中。
  3. 返回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. 定义一个哈希表,用于存储每个字符出现的次数。
  2. 遍历字符串中的每个字符,将其对应的哈希表中的值加1。
  3. 再次遍历字符串中的每个字符,查找其在哈希表中的值,如果为1,则说明该字符只出现了一次,将计数器加1。
  4. 返回计数器的值,即为没有重复的字符个数。

下面是用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容器中不允许出现重复的元素。具体步骤如下:

  1. 定义一个空的set容器,用于存储字符串中出现过的字符。
  2. 遍历字符串中的每个字符,将其加入set容器中。
  3. 返回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数组并输出。

猜你喜欢

转载自blog.csdn.net/qq_46901210/article/details/127633913