1.c风格字符串
头文件 | #include<cstring> |
结束 | \0 |
定义方式 | 1.char a1[3]={'a','b','c'}//这个不是字符串 2.char a2[4]={'a','b','c','\0'} 3.char a3[4]="abc"; 4.char a4[]="abc"; 5.char *p=c; //用一个指针指向该数组,*(p+i) <=> a[i] 只有在定义时候可以一整串赋值 6.char str[30] = {0}; //将所有元素都初始化为 0,或者说 '\0' |
长度测量 | 1.sizeof()返回占总空间字节数 2.strlen()返回字符数组字节数 |
输入方式 | 1.cin到空格,制表符,换行符截止,不舍弃换行 2.getline到换行符截止 3.get到换行符之后截止,不舍弃 4.scanf可以设定 |
输出方式 | 1.printf("%s",str); 2.printf("%c",c[i]); 3.puts(a);//输出后自动换行 |
字符串数组 | 可以使用: char a[] [10]; 或者 char *a[]; 表示 |
举例1:
char str1[100] = "abcde";
char str2[] = "abcde";
char str3[] = "abcd\0e";
char str4[] = "abcd\0e\n";
printf("%d,%d\n",sizeof(str1),strlen(str1));//100,5
printf("%d,%d\n", sizeof(str2), strlen(str2));//6,5
printf("%d,%d\n", sizeof(str3), strlen(str3));//7,4
printf("%d,%d\n", sizeof(str4), strlen(str4));//8,4
举例2:字符串的复制
void Mystrcpy(char des[], char src[])
{
int i;
for (i = 0; src[i] != '\0'; i++)//字符串遍历方式
{
des[i] = src[i];
}
des[i] = '\0';
}
举例3
char s1[105];
cin.getline(s1,长度);
char s1[10005],s2[10005];
scanf("%[^\n]",s1);
getchar();
scanf("%[^\n]",s2);//分别输入两句话,带有空格
string s2;
getline(cin,s2);
cin.get();
getchar();//两输入语句中跳过一个空白符(space,tab,newline),也可以在scanf前加入\n
char s3[105];
scanf("%[^\n]",s3];//格式字符%[]扫描字符集合,默认为空格
scanf("%s", str)默认回车和空格作为组输入间隔或结束符号
……当输入字符串时,后 将被当作当前输入的结束符
fflush(stdin);//清除缓冲区所有数据
注意:
1.在函数内部定义的变量、数组、结构体、共用体等都称为局部数据。在很多编译器下,局部数据的初始值都是随机的
2.scanf() 在读取数据时需要的是数据的地址,这一点是恒定不变的,所以对于 int、char、float 等类型的变量都要在前边添加&以获取它们的地址。但是因为字符串名字或者数组名字在使用的过程中一般都会转换为地址,所以再添加&就是多此一举了。
就目前学到的知识而言,int、char、float 等类型的变量用于 scanf() 时都要在前面添加&,而数组或者字符串用于 scanf() 时不用添加&
2.string风格字符串
头文件 | #include<string> |
定义 | string a; string a="abc"; |
注意 | 1.没有\0的概念 2.可以cin直接输入输出 |
长度测量 | 1..length() 2..size() |
输入 | 1.get 2.getline |
举例1:
string a,b;
cin>>a;//abc
getchar();//换行
getline(cin,b); //abcd
int l1=a.size(),l2=b.size();//输出3,4
3.函数
将字符串转换成浮点数 | 需以有效数字开头,允许非e结尾 例如:atof( "42.0is_" );//为42.0. | |
将字符串转换成整数 | 转成整数atoi("512.") | |
将字符串转换成长整型数 | 会跳过开头的空格 | |
当字母或数字字符时, 返回真值 | 判断字符是否是数字字母 | |
当字母字符时, 返回真值 | isplpha(a)//如果a是字母,返回真 | |
当控制字符时, 返回真值 | 是0-0x1f,或者0x7f | |
当数字字符时, 返回真值 | 0-9 | |
当非空格可打印字符时, 返回真值 | 除了空格的可见字符 | |
当小写字母字符时, 返回真值 | 小写 | |
当可打印字符时, 返回真值 | 包括空格的可见字符 | |
当标点字符时, 返回真值 | 除了字母数字和空格的可见字符 | |
当空格字符时, 返回真值 | 看不见又看得见的字符 | |
当大写字母字符时, 返回真值 | 大写 | |
当十六进制字符时, 返回真值 | 是A-F,a-f,0-9 | |
在某一内存范围中查找一特定字符 | 三个参数值 a数组,b查找字符,c数组长度 返回指针,指向首次出现的位置,如果没有找到返回NULL | |
比较内存内容 | 三个参数 a字符串,b字符串,c长度 比较a,b的前c个字符 如果小于0说明a小,等于0说明一样 | |
拷贝内存内容 | 三个参数 a指针,b字符串,c复制个数 会把b中的c个赋值给a,然后返回a | |
拷贝内存内容 | a,b指针一样时还可以工作 | |
将一段内存空间填入某值 | 三个参数 a字符串,b填入值,c长度 把b填到a字符串从头开始数的c长度 返回a字符串 | |
连接两个字符串 | a字符串b字符串 把b连接到a后面,返回a | |
查找某字符在字符串中首次出现的位置 | 两个参数 a字符串,2值 返回ch首次出现位置的指针,没有NULL | |
比较两个字符串 | 三个参数 a字符串,b字符串,c长度 比较a,b的前c个字符 如果小于0说明a小,等于0说明一样 | |
采用目前区域的字符排列次序来比较字符串 | 类似 | |
拷贝字符串 | 两个参数 字符串a,字符串b 把b赋值給a,返回a(a是一个指针指向字符串 | |
在某字符串中匹配指定字符串 | ||
返回错误码对应的文本信息 | ||
返回指定字符串的长度 | ||
连接某一长度的两个字符串 | ||
比较某一长度的两个字符串 | ||
复制某一长度的一个字符串到另一字符串中 | ||
查找某字符串在另一字符串中首次出现的位置 | ||
查找某字符在字符串中末次出现的位置 | ||
返回子串的长度,子串的字符都出现包含于另一字符串中 | ||
在一字符串中查找指定的子串首次出现的位置 | ||
将字符串转换成浮点数 | ||
查找指定字符之前的子串 | ||
将字符串转换成长整型数 | ||
将字符串转换成无符号长整型数 | ||
转换子串, 可以用于字符串比较 | ||
将字符转换成小写字符 | ||
将字符转换成大写字符 |
4.具体实现
举例1:天梯赛L1-094剪切粘贴
#include<iostream>
using namespace std;
int main(){
string s;cin>>s;
int n;cin>>n;
while(n--){
int a,b;string x,y;
cin>>a>>b>>x>>y;
string t=s.substr(a-1,b-a+1);//让t等于s中从s[a-1]开始,复制b-a+1长度的子字符串
s.erase(a-1,b-a+1);//将s中上面那段删除
int idx=s.find(x+y);//此时在s中寻找x拼接上y第一次出现的位置
if(idx<s.size()){//找到位置
s.insert(idx+x.size(),t);//意是在idx第一次出现的位置过去x个,插入一个字符串t
}
else s+=t;//把t加到s字符串的尾部
}
cout<<s;
}
举例2:L1-011实现两个句子输入,第一个不出现第二个
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[10005],b[10005];
scanf("%[^\n]",a);
getchar();
scanf("%[^\n]",b);I love GPLT! It's a fun game!
aeiou
for (int i = 0;i < strlen(a);i++)
{
if (strchr(b, a[i]))//函数返回一个指向str 中ch 首次出现的位置,当没有在str 中找ch到返回NULL。
continue;
else
printf("%c", a[i]);
}
return 0;
}I lv GPLT! It's fn gm!
举例3:L1-32题的意思是少加多去
#include<iostream>
using namespace std;
int main()
{
int n,l;char a;
string b;cin>>n>>a;
getchar( );
getline(cin,b);
l=b.size();
if(l>=n) cout<<b.substr(l-n);//意为输出,0到l-n的字符串
else cout<<b.insert(0,n-l,a);//意为插入a在0到n-l的地方
}