字符串操作
头文件
#include <string>
初始化
string s1(“abc”);
string s2(s1);
string s3(4, ‘s’);//初始化为4个’s’
char* p = “hello”;
string s(p);
s = p;
倒置
#include <algorithm>
std::reverse(str.begin(),str.end());
查找
- find 从头开始找
- rfind 从尾开始找
size_t find (const string& str, size_t pos = 0);//查找子string,默认从父string的第0个字符开始,如果要查找多个相似的,则可以将pos设置为上次查找到的+1
size_t find (const char* s, size_t pos = 0);//查找字符串,默认从0开始
size_t find (const char* s, size_t pos, size_type n);//同上,但只比较n个
size_t find (char c, size_t pos = 0);//比较字符。
当然,形参初始化的值可能不一样,返回的都是地址索引,需要通过found!=std::string::npos判断是否有效。
find_first_of
find_last_of
find_first_not_of
find_last_not_of
也有上面四种重载,不过这里是返回第一个出现、没有出现在子str的字符的索引。
如:
std::string str (“look for non-alphabetic characters…”);
std::size_t found = str.find_first_not_of(“abcdefghijklmnopqrstuvwxyz “);
将返回’-‘的索引.
大小写
直接使用 std::isupper库函数,类似还有:
#include <cctype>
int isupper( int ch );
int islower( int ch );
int toupper( int ch );
int tolower( int ch );
比较字符换大小
一共五种重载形式
int compare (const string& str);
int compare (size_t pos, size_t len, const string& str);
int compare (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen);
int compare (const char* s) const;
int compare (size_t pos, size_t len, const char* s);
int compare (size_t pos, size_t len, const char* s, size_t n);
返回与右边一致,其中pos表示从str的第几个元素开始比较,一共比较len个字符,如果不够,则有多少比较多少。subpos、sublen是相对比较字符串而言的
string重载了==、<等符号,可以直接用符号比较
string没有提供不区分大小写的比较,感觉可以读取出数据后通过右侧的函数来进行比较。
数字转字符串
- stringstream(多次使用需要使用clear()清除)
int N = 10;
stringstream ss;//#include <sstream>
string str;
ss << N;
ss >> str;
- string = std::to_string(N)方法
只需包含头文件即可
字符串转数字
-
N = stringToNum
(str);
# include <sstream> -
stringstream (多次使用需要使用clear()清除)
#include <sstream>
string a = “123.32”;
double res;
stringstream ss;
ss << a;
ss >> res;
拷贝与合并
- 拷贝
std::string::copy
size_t copy (char* s, size_t len, size_t pos = 0) const;
Example
char buffer[10];
string str ("Test string...");
std::size_t length = str.copy(p, 5, 0);
buffer[length]='\0'; // 从第0个开始复制5个,返回有效复制的数量,需要在p最后添加’\0’
- 合并
合并直接用+号即可
字符换切割
string substr (size_t pos = 0, size_t len = npos):
std::string str2 = str.substr (3,5); //返回str的第3个开始的5个元素。可以配合find函数来实现针对特殊元素的切割
题目:
电话号码转换
某语音翻译软件,需要实现如下中英文电话号码转换功能:
· 若输入的是英文数字单词或Double组成的电话号码,则输出对应的中文数字单词;
· 若输入为中文数字单词组成的电话号码,则输出对应的英文数字单词。
· 若输入不合法,则输出字符串ERROR。
中文数字、英文数字分别见下表:
中文数字单词:Yi Er San Si Wu Liu Qi Ba Jiu Ling
英文数字单词:One Two Three Four Five Six Seven Eight Nine Zero
说明:
-
输入若存在Double,其后必须跟随英文数字单词,代表两个该数字。如输入DoubleSix,代表 SixSix; -
输入保证要么全中文,要么全英文(含Double),并且每个单词都是合法的英文数字单词/中文数字单词/Double; -
输入不合法的场景,仅为Double后跟随的不是英文数字单词。如DoubleLiu 非法。
解答要求时间限制:1000ms, 内存限制:256MB
输入
一行仅由大小写字母组成的字符串,非空且长度不大于500
输出
一个字符串,表示转换后的电话号码;若输入不合法,输出ERROR。
样例
输入样例 1 复制
SixOneThreeOneDoubleZero
输出样例 1
LiuYiSanYiLingLing
输入样例 2 复制
YiLingSanSanJiu
输出样例 2
OneZeroThreeThreeNine
输入样例 3 复制
DoubleLiu
输出样例 3
ERROR
- 题目分析
知识点:字符串处理(字符串查找、比较、拷贝等),这题主要考察基本编程功底及逻辑能力,解法很多、不需要复杂的算法。在实际工作中,会遇到很多字符串处理的问题,希望通过本题的学习让大家能够有所收获。
解题的思路就是先建立中文单词和英文单词的映射关系,然后对输入字符串中的单词逐个匹配,要注意的地方是如果出现Double,那么后面的英文单词需要输出2次或者ERROR。

浙公网安备 33010602011771号