字符、字符数组、字符串及其函数(随时补充)
一、字符和字符数组
1.字符与数字的转换
字符虽然是char类型,但本质是一个ASCLL码,可以之间进行加减操作,加减完要是用cout输出默认是int类型,用printf可以自定义输出的类型。
一个字符可以通过+-一个int类型的数转换成int类型。一个int类型要是+-一个字符,结果还是int类型。
一般字符"1"想转换成int 类型的数字1 如: char a="1"; int b=a-'0';
2.计算字符数组的长度
对于字符数组,要求字符数组里有多少个字符,如char c[50],要用strlen(c),不包含结尾的\0,这个函数要cstring头文件。 如: #include<cstring> char s[10]; int len=strlne(s);
3.读入数据到字符数组
<1>输入流里面没有换行和空格时:
可以直接用for循环用cin或者scanf(%c)读入。
<2>输入流里面有换行和空格时:
若是有空格,可以使用cin.getline(a[],20),直接读入一行,空格也被读入。超过20的不会输入,少于20,输入多少是多少。完整函数应该是cin.getline(数组名,输入字符个数,结束符(char类型))
结束符不输入默认为换行。cin.getline()不用考虑末尾换行,cin.get()需要考虑要是读取一行字符串时我们一般声明头文件cstring,用getline()和get()函数,这两个函数都读取一行输入,直到换行符就停。一般用get。 get(),将换行符保留在输出序列,有两个参数, 第一个参数是要被输入的数组,第二个参数是输入读取的字符数。cin.get(a[],b)。 但是要是要再读一行,要在两个get()函数中间行加一个cin.get()读掉那个换行符,否则下一个打不出来。也可以合并两个,如cin.get(a[],b).get(); getline()同上,但是输入完不保留换行符。 也可以合并如cin.getline(a[],b).getline(c[],d); #include<iostream> #include<string> #include<cstring> using namespace std; int main() { char c[50]; cin.getline(c,sizeof(c)); return 0; }
二、字符串及其函数
1.理解上
string是一个单独的类,c里面不能直接使用要有头文件string,string中每个元素实际上是char * 类型的。可以把一个字符串看成一个字符数组。
2.定义问题
一般又
一般有三种方法来定义一个字符串。 1,用string (const char * s)来定义字符串ss 2,用string(const string& str),使用一个string对象初始另一个string对象 3,用string name(int a,char c)把name定义为a个c #include<iostream> #include<string> using namespace std; const char* str="hello world"; int main() { string ss(str);//方法1 string ss2(ss);//方法2 string ss3(10,'c');//方法3 //但是一般就是直接定义出来 string s="hello world"; return 0; }
3,string 基本操作,读入操作
string类型的变量可以直接+,-,=,+=操作。
#include<iostream> #include<string> using namespace std; int main() { string s; cin>>s;//没有空格和换行时 getline(cin,s);//读入一行字符串,遇到空格不会停,要考虑换行符 return 0; }
4,重点!!!字符串函数(骚操作)
<1>字符串长度 s.size() string
要求string类型的字符长度,如string s,要用s.size()或者s.length()来求。 求字符串数组一个元素的长度也可以用,如a[1].size()。size()获得的长度不包括\0。 #include<string> #include<iostream> using namespace std; int main() { string s="I am very handsome" int len=s.size(); }
<2>字符串反转 reverse() algorithm
头文件为#include<algorithm> 可以通过reverse(s.begin(),s.end()) 也可以写成reverse(a,a+10),0~9,不包括10(类似sort)将一个字符串反过来,执行完s就被反过来。 如: #include<iostream> #include<algorithm> #include<string> using namespace std; int main() { string s="hello world"; reverse(s.begin,s.end()); reverse(s,s+11); }
<3>查找指定子串 s.find() cstring
str.find(str, begin=0, end=len(string)) str -- 指定检索的字符串 beg -- 开始索引,默认为0。 end -- 结束索引,默认为字符串的长度。 可以用s.find(“ddd”,int a,int b)来查找从a开始到b的字符串s里的指定子串"ddd" 返回子串首次出现的位置,返回值类型是int,所以要定义一个int变量来记录返回的位置。 如果没有找到,会返回一个很大的数,一般识别不了而默认为-1。 s.rfind()是从右向左找。 如: #include<iostream> #include<cstring> #include<stirng> using namespace std; int main() { string s="hello world"; int len=s.size() int x=s.find("d",0,len); if(x==-1) cout<<"没找到"; }
<4>在字符串中插入字符串 s.insert() cstring
s.insert(2,”wwww”)在位置2处开始,插入"wwww" 如: #include<iostream> #include<string> #include<cstring> using namespace std; int main() { string s="ho world"; s.insert(2,"ell"); return 0; }
<5>在字符串中删去字符 s.erase() cstring
s.erase(5,7)从位置5处开始删除7个字符,包含位置5,即删除[5,12]的字符。 如: #include<iostream> #include<string> #include<cstring> using namespace std; int main() { string s="hello abcde world"; s.erase(7,6); return 0; }
<6>获取字符串的子串 s.substr(a,b)
s.substr(1,3)从位置1处复制3个字符出来形成子串,取出来不会影响原字符串, 如: #include<iostream> #include<string> #include<cstring> using namespace std; int main() { string s="hello world"; string s1=s.substr(0,5); return 0; }
<7>字符串替换 s.replace() cstirng
s.replace(int a,int b,”aaaa”)把字符串s从第a个元素开始,后面的b个元素替换成”aaaa”, 不管你b和“aaaa“的长度,都全部替换掉。 #include<iostream> #include<string> #include<cstring> using namespace std; int main() { string s="hello world"; s.replace(0,5,"goodbye"); return 0; }
<8> 字符串拷贝函数 strcpy(char名1[],char名2 [])
<9>字符串转换成n进制 stoi(字符串名,起始位置,n进制)
Devc++里不能用这个函数,牛客可以用,这个函数好像不是标准函数,能不用就不用
#include<string>//头文件是string using namespace std; int main() { string s="1234567"; int a=stoi(s,0,10); //也可以int a=stoi(s),因为默认从0位置开始,默认转化成十进制 cout<<a; return 0; }
<10>将数字常量转换成字符串 to_string(数字)
#include<iostream> #include<string>//头文件 using namespace std; int main() { int a=120215; string s=to_string(a);//括号里可以直接填数字,直接把数字转换成字符串,也可以是小数 cout<<s; return 0; }
<11>
<12>
<13>