===============
一文读懂C++ String类在算法竞赛中的常见用法
string 相较于C语言的字符数组可方便太多了,在算法竞赛中能大大节省我们的时间。以下是我在刷题中会使用到的常见String用法。注释都写好了。
#include <iostream>
#include <string>
using namespace std;
int main(){
//1、字符串拼接
string s1 = "Hello";
string s2 = "World!";
string s3 = s1 + s2;
cout<< s3 <<endl; //输出为HelloWorld!
s3.append("123"); //字符串自加
cout<< s3 <<endl; //输出为HelloWorld!123
//2、字符串输入输出
// cin >> s3; //输入Hello World! cin是以空格,回车作为结束输入的标志
// cout<< s3 <<endl; //输出为Hello
//3、读取一行字符
// getline(cin, s3); // 读取⼀⾏的字符串,包括空格 输入Hello World!
cout<< s3 <<endl; //输出为Hello World!
//4、获取字符串的长度
int lens1 = s1.length();
cout<< lens1 <<endl; //输出为5
int lens2 = s2.size();
cout<< lens2 <<endl; //输出为6
//5、将字符串当成字符数组使用
cout<<s1[0]<<endl; //输出为H
cout<<s1[1]<<endl; //输出为e
cout<<s1[2]<<endl; //输出为l
//6、字符串与字符数组的互换
//字符串转字符数组
//方法1
char a[100];
int lens = s1.copy(a,s1.size());
a[lens] = '\0';
printf("%s\n",a); //输出Hello
//方法2
strcpy(a,s2.c_str());
printf("%s\n",a); //输出World!
//字符数组转字符串
string s5(a);
cout<<s5<<endl; //输出World!
//7、字符串的比较
s1 = "abc";
s2 = "abb";
if (s1 > s2) cout<<"yes1"<<endl; //输出yes1 按照字典序比大小
s1 = "Abc";
s2 = "abb";
if (s1 > s2) cout<<"yes2"<<endl; //不输出,大小写敏感,且大写字母的值小于小写字母的值 按照字典序比大小
s1 = "A";
s2 = "a";
if (s1 < s2) cout<<"yes3"<<endl; //输出yes3 大写字母的值小于小写字母的值
//8、字符串的子串
s1 = "hello World!";
s2 = s1.substr(2,5);
cout<<s2<<endl; //输出 llo W 从下标2开始 截取5个字符
s2 = s1.substr(3);
cout<<s2<<endl; //输出 llo W 从下标3开始 截取3到末尾的所有字符
//9、查找字符串的子串
int n = s1.find("World");
cout<<n<<endl; //输出6 即从下标6开始就是这个匹配的字符
cout<<s1.find("o")<<endl; //输出4 从前往后查找输出最先匹配到的下标
cout<<s1.rfind("o")<<endl; //输出7 从后往前查找输出最先匹配到的下标
cout<<s1.find("oo")<<endl; //输出18446744073709551615 额,反正就是没有找到
//10、替换字符串
s1 = "hello World!";
s1.replace(0,5,"fuck");
cout<<s1<<endl; //输出fuck World!
//指定替换 例如将World! 中的orl 替换成ORL
n = s1.find("orl");
s1.replace(n,3,"ORL");
cout<<s1<<endl; //输出fuck WORLd!
//11、删除子串
s1.erase(n,3); //n表示位置 3表示删除三个字符
cout<<s1<<endl; //输出fuck Wd!
//12、添加子串
s1.insert(5,"aaa");//5表示位置 "aaa"表示增加的字符串
cout<<s1<<endl; //输出fuck aaaWd!
//13、STL 操作string
string s("afgc1bed3");
string::iterator p = find(s.begin(), s.end(), 'c');
if (p!= s.end())
cout << p - s.begin() << endl; //输出3 相当于c的指针-头指针
sort(s.begin(), s.end()); //字符串排序
cout << s << endl; //输出 13abcdefg
//其余STL操作就不演示了,基本上都是支持的
return 0;
}
https://www.cnblogs.com/xwxz/p/14719027.html
============
中间无空格字符串接收
// 方法一
string s;
cin>>s;
// 方法二
string t;
t.resize(10); //必须设置大小
scanf("%s", t.c_str()); //输入 123aaa
cout<<t<<endl; //输出 123aaa
中间带空格字符串接收
getline(cin, s);
getline()和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样两个函数
若getline(cin,str)前有cin<<a;那么影响geline,geline第一个读取到的将是cin输入a时缓存在缓存中的回车
int n;
string s;
cin>>n;
getchar();//吸收缓冲区中回车
while(n-->0){
getline(cin,s); //接收整行测试数据,整行中可以有多个空格
}
注: PAT常见问题中有说明:某些库函数因为存在安全隐患是不能用的,目前主要常见的是itoa和gets。
字符串输出
// 方法一
string s="Hello World!";
printf("%s",s.c_str());
cout<<s<<endl;
// 方法二
char sc[13]="Hello World!";
printf("%s", sc);
cout<<sc<<endl;
拼接
字符串拼接数字
/*
字符串拼接数字
*/
string st = "aaa";
//error
//st.append(11); //error need string
//st.push_back(65); //success but 65='A'
//cout<<st<<endl; //aaaA
//st+=65; //success but 65='A'
//cout<<st<<endl; //aaaAA
// correct
st+=to_string(11);
cout<<st<<endl;
st.append(1,9+'0');//在结尾追加一个字符'9'
cout<<st<<endl;
st.push_back(char(7+'0'));//在结尾追加一个字符'7'
字符串拼接字符
/*
字符串拼接字符
*/
string str = "aaa";
str+='A';
cout<<str<<endl;//aaaA
str.push_back('B');
cout<<str<<endl;//aaaAB
//str.append('B'); //error
str.append(3, 'C');
cout<<str<<endl;//aaaABCCC
字符串拼接字符串
/*
字符串拼接字符串
*/
string s = "aaa";
s.append("bbb");
cout<<s<<endl;//aaabbb
s+="ccc";
cout<<s<<endl;//aaabbbccc
// s.push_back("ddd");//error, need char
查找
查找子串
函数返回值 | 函数名(参数列表) |
---|---|
string (1) | size_t find (const string& str, size_t pos = 0) const noexcept; |
c-string (2) | size_t find (const char* s, size_t pos = 0) const; |
buffer (3) | size_t find (const char* s, size_t pos, size_type n) const; |
character (4) | size_t find (char c, size_t pos = 0) const noexcept; |
#include <iostream>
using namespace std;
int main(int argc,char * argv[]) {
string s = "There are two needles in this haystack with needles.";
string s2 = "needle";
size_t found = s.find(s2); //查找子串,返回首字符出现位置
if (found!=string::npos)
std::cout << "first 'needle' found at: " << found << '\n';
found=s.find("needles are small",found+1,6); //参数说明:子串,原串其实匹配位置,需匹配的子串长度
if (found!=string::npos)
std::cout << "second 'needle' found at: " << found << '\n';
found=s.find("haystack"); //查找子串,返回首字符出现位置
if (found!=string::npos)
std::cout << "'haystack' also found at: " << found << '\n';
found=s.find('.'); //查找字符,返回首次出现位置
if (found!=string::npos)
std::cout << "Period found at: " << found << '\n';
// let's replace the first needle:
s.replace(s.find(s2),s2.length(),"preposition"); //替换第一个找到的s2所在位置,s2长度个字符
std::cout << s << '\n';
return 0;
}
子串擦除
// string::erase
#include <iostream>
#include <string>
int main ()
{
std::string str ("This is an example sentence.");
std::cout << str << '\n';
// "This is an example sentence."
str.erase (10,8); // ^^^^^^^^
std::cout << str << '\n';
// "This is an sentence."
str.erase (str.begin()+9); // ^
std::cout << str << '\n';
// "This is a sentence."
str.erase (str.begin()+5, str.end()-9); // ^^^^^
std::cout << str << '\n';
// "This sentence."
return 0;
}
字符/字符串插入
// inserting into a string
#include <iostream>
#include <string>
int main ()
{
std::string str="to be question";
std::string str2="the ";
std::string str3="or not to be";
std::string::iterator it;
// used in the same order as described above:
str.insert(6,str2); // to be (the )question
str.insert(6,str3,3,4); // to be (not )the question
str.insert(10,"that is cool",8); // to be not (that is )the question
str.insert(10,"to be "); // to be not (to be )that is the question
str.insert(15,1,':'); // to be not to be(:) that is the question
it = str.insert(str.begin()+5,','); // to be(,) not to be: that is the question
str.insert (str.end(),3,'.'); // to be, not to be: that is the question(...)
str.insert (it+2,str3.begin(),str3.begin()+3); // (or )
std::cout << str << '\n';
return 0;
}
数值型字符串转换为数值
将数字转换为字符串
- to_string
将字符串转换为整数(a开头的函数,需要将string转换为char * , string.c_str())
- atof(字符数组):将字符串转换为双精度浮点型值。
- atoi(字符数组):将字符串转换为整型值。
- atol(字符数组):将字符串转换为长整型值。
- strtol(字符串,结束位置,进制):结束位置若为结尾则为NULL,进制默认0为十进制
- stoi(字符串):将字符串转换为int
- stof(字符串):将字符串转换为浮点数
- stod(字符串):将字符串转换为双精度浮点数
cout<<"----------字符串与数字转换-------------"<<endl;
cout<<"----------字符串->>int整数转换-------------"<<endl;
//有效转换长度为10位
string si = "1234";
cout<<atoi(si.c_str())<<endl; //1234
cout<<stoi(si)<<endl; //1234
cout<<stoi(si.c_str())<<endl; //1234
cout<<"----------字符串->>long整数转换-------------"<<endl;
string si0 = "2147483645";
cout<<strtol(si0.c_str(),NULL,0)<<endl; //2147483645
string sil = "214748364888";
cout<<strtol(sil.c_str(),NULL,0)<<endl; //2147483647 超过最大值后,按最大值输出
cout<<"----------字符串->>浮点数转换-------------"<<endl;
string sid = "1234.231235678";
cout<<atof(sid.c_str())<<endl; //1234
cout<<stof(sid)<<endl; //1234.23
cout<<stod(sid)<<endl; //1234.23
cout<<stod(sid.c_str())<<endl; //1234
cout<<"----------浮点数->>字符串转换-------------"<<endl;
double d = 1234.1234;
cout<<to_string(d) <<endl;
cout<<"----------整数数->>字符串转换-------------"<<endl;
int in = 2147483647;
cout<<to_string(in)<<endl;
long lg = 2147483648;
cout<<to_string(lg)<<endl; //-2147483648
字符串模式匹配
sscanf和sprintf
适用场景
输入一组数据,从数据中筛选出符合格式的数字或字符串进行其他处理
sscanf 将字符串a格式化到temp变量中,如果不是double类型也有数据,但是sprintf后格式不匹配为0.00
%lf换成%f不可以,因为%f接收的是float型数据,而temp是double型数据
sprintf 将temp格式化到字符串b中,如果不是double型,b匹配不成功为0;
如果类型不符,b为0.00;比如sscanf接收 aab1234.12,temp有值,但是sprintf输出为0.00
如有小数点后位数大于格化式要求,b匹配时会四舍五入;
代码
#include <iostream>
#include <string>
using namespace std;
int main() {
char a[50], b[50];
scanf("%s", a);
double temp;
/*
sscanf 将字符串a格式化到temp变量中,如果不是double类型也有数据,但是sprintf后格式不匹配会输出0.00
%lf换成%f不可以,因为%f接收的是float型数据,而temp是double型数据
sprintf 将temp格式化到字符串b中,如果不是double型,b匹配不成功为0;
如果类型不符,b为0.00;比如sscanf接收 aab1234.12,temp有值,但是sprintf输出为0.00
如有小数点后位数大于格化式要求,b匹配时会四舍五入;
*/
sscanf(a, "%lf", &temp);
sprintf(b, "%.2f",temp);
cout<<" a: "<<a<<endl;
cout<<" b: "<<b<<endl;
cout<<" temp: "<<temp<<endl;
return 0;
}
测试结果:
abc1234.23
a: abc1234.23
b: 0.00
temp: 2.61855e-322123.1234
a: 123.1234
b: 123.12
temp: 123.123123.234
a: 123.234
b: 123.23
temp: 123.234123.2345678
a: 123.2345678
b: 123.23
temp: 123.235-23.12
a: -23.12
b: -23.12
temp: -23.12abcsdasdf
a: abcsdasdf
b: 0.00
temp: 2.61855e-322
123.479
a: 123.479
b: 123.48
temp: 123.479
字符数组
字符数组长度获取
strlen
- 1 strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)
- 2 #include 或 #include <string.h>。中没有
#include <cstring>
char a[40];
int alen = strlen(a);
strlen和sizeof的区别
This should not be confused with the size of the array that holds the string. For example:
char mystr[100]="test string";
defines an array of characters with a size of 100
char
s, but the C string with which mystr has been initialized has a length of only 11 characters. Therefore, whilesizeof(mystr)
evaluates to100
,strlen(mystr)
returns11
.
https://www.cnblogs.com/houzm/p/13370074.html
============
getline():用于读入一整行的数据。在C++中,有两种getline函数。第一种定义在头文件<istream>中,是istream类的成员函数;第二种定义在头文件<string>中,是普通函数。
第一种: 在<istream>中的getline()函数有两种重载形式:
istream& getline (char* s, streamsize n ); istream& getline (char* s, streamsize n, char delim );
作用是: 从istream中读取至多n个字符(包含结束标记符)保存在s对应的数组中。即使还没读够n个字符,如果遇到delim标识符或字数达到限制,则读取终止。delim标识符会被读取,但是不会被保存进s对应的数组中。注意,delim标识符在指定最大字符数n的时候才有效。
#include <iostream> using namespace std; int main() { char name[256], wolds[256]; cout<<"Input your name: "; cin.getline(name,256); cout<<name<<endl; cout<<"Input your wolds: "; cin.getline(wolds,256,','); cout<<wolds<<endl; cin.getline(wolds,256,','); cout<<wolds<<endl; return 0; }
输入
Kevin Hi,Kevin,morning
输出
Kevin Hi Kevin
第二种: 在<string>中的getline函数有四种重载形式:
istream& getline (istream& is, string& str, char delim); istream& getline (istream&& is, string& str, char delim); istream& getline (istream& is, string& str); istream& getline (istream&& is, string& str);
用法和上第一种类似,但是读取的istream是作为参数is传进函数的。读取的字符串保存在string类型的str中。
is:表示一个输入流,例如cin。
str:string类型的引用,用来存储输入流中的流信息。
delim:char类型的变量,所设置的截断字符;在不自定义设置的情况下,遇到’\n’,则终止输入。
#include<iostream> #include<string> using namespace std; int main(){ string str; getline(cin, str, 'A'); cout<<"The string we have gotten is :"<<str<<'.'<<endl; getline(cin, str, 'B'); cout<<"The string we have gotten is :"<<str<<'.'<<endl; return 0;}
输入
i_am_A_student_from_Beijing
输出
The string we have gotten is :i_am_. The string we have gotten is :_student_from_.
https://www.cnblogs.com/yun-an/p/11458060.html
============
参考:
https://www.cnblogs.com/xwxz/p/14719027.html
标签:string,temp,c++,例子,str,字符串,getline,cout From: https://www.cnblogs.com/rebrobot/p/18219796