一、字符串的三种形式
1." ";双引号之间的字符串(结尾自动添加'\0')。
2.以'\0'结尾的字符串数组。
3.string(STL);这里不做过多解释,以后再做详解。
这里留一个思考题:字符串数组和字符串有什么区别?(提示:结尾的'\0'结束符)
二、字符串的输入输出
1.scanf();遇见空格、换行输入结束。回车时自动添加‘\0’;在处理字符时,输入回车或者空格,这些字符会写入输入流中,保存在输入流中,下次如果需要输入字符时,没等输入时,会直接把这些字符读入。
scanf("%d",a);
scanf("%c",b);
//此时的输入就会造成错误,当你输入数字以回车结束后,回车符会保存在输入流中。
//后面再需要输入时,会直接把输入流中的回车符赋值给b
//解决方法
//1.
scanf("%d",a);
scanf(" %c",b);
//输入字符时,在%c前面加上空格即可把输入流中的字符吃掉
//2.
scanf("%d",a);
getchar();//可将回车符吃掉.
scanf("%c",b);
AC代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
char b[105];
int main(){
int t;
scanf("%d",&t);
getchar();//吃掉输入流中回车符
while(t--){
gets(b);//后面会写到
int n=strlen(b);
int a=0,e=0,i=0,o=0,u=0;//计数,在多组输入里面
for(int j=0;j<n;j++){
if(b[j]=='a'||b[j]+32=='a')a++;
if(b[j]=='e'||b[j]+32=='e')e++;
if(b[j]=='i'||b[j]+32=='i')i++;
if(b[j]=='o'||b[j]+32=='o')o++;
if(b[j]=='u'||b[j]+32=='u')u++;
}
printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d\n",a,e,i,o,u);
if(t>=1)//控制两个示例间的空行
printf("\n");
}
return 0;
}
2.scanf("%s",a);
用scanf();需注意最后一位自动添加'\0'造成的数组越界问题。
char a[5];
scanf("%s",a);
//输入1 2 3 4 5会造成数组越界,最后自动添加的'\0'没有存储位置。
AC代码:
//统计数字字符出现的次数
#include<stdio.h>
#include<math.h>
#include<string.h>
char a[10000];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int count=0;//计数,此变量一定要在多组输入里面
scanf("%s",a);
for(int i=0;a[i];i++){
if(a[i]<='9'&&a[i]>='0')//是否为数组字符的判断(思考:是否是大小写?)
count++;
}
printf("%d\n",count);
}
return 0;
}
3.如果我们要输入带空格的字符串此时就需要用别的办法了,下面有两种办法。
<1>(避免数组越界)cin.getline(a,sizeof(a));()//遇空格不结束输入,回车不写入a,同时,回车也不写入输入流中;输入数组的长度应该为a.size-1。(此输入办法不常用)
<2>(常用方法)gets(a);//读入一行,结尾自动添加'\0';回车不写入a,,同时,回车也不写入输入流中,但是此函数可能导致数组越界。
AC代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
char a[10000];
int main(){
while(gets(a)){ //多组输入字符串
int n=strlen(a);//字符串求长度的函数
a[0]-=32;//大小写转换(思考:数字和整型如何转换?)
for(int i=1;i<n;i++){
if(a[i]==' ')
a[i+1]-=32;
}
for(int i=0;i<n;i++)
printf("%c",a[i]);
printf("\n");//输出
// puts(a);//puts();与gets();对应的输出,此函数的输出遇到'\0'结束,eg:abc\0abc
}
return 0;
}
三、字符串函数(头文件:#include<cstring>)
函数的原理都是for循环来实现的。a,b均为数组,函数执行过程中可能会造成数组越界。
1.strcpy(a,b);字符串复制函数,将b复制到a中。
2.strcmp(a,b);字符串比较函数,返回值可能是>0,<0,=0;字符串的大小按照字符串来进行。
3.strcat(a,b);字符串连接函数。将b中的元素连接在a的后面(从a的'\0'开始)。
4.strlen(a);求数组a的长度(不包含'\0')。
//strlen(a);的运用
1.for(int i=0;i<strlen(a);i++)
//从时间复杂度来看,此方法不合适(推荐用以下两种)
2.int len=strlen(a);
for(int i=0;i<len;i++)
3.for(int i=0;a[i];i++)
//最后一位是'\0'(数字0)
5.atoi;字符串转int
atof;字符串转folat
atod;字符串转double
hdu 1004----Let the Balloon Rise
AC代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
char a[1005][15];//保存输入的多个字符串
int b[1005];
int main()
{
int n;
while(scanf("%d",&n)&&n){
memset(b,0,sizeof(b));//每组输入前,需要清空b
int mmax=-1;
for(int i=0;i<n;i++)
scanf("%s",a[i]);//输入n个字符串
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
if(strcmp(a[i],a[j])==0)//遍历比较计数
b[i]++;
}
if(mmax<b[i])
mmax=b[i];
}
for(int i=0;i<n;i++){
if(mmax==b[i]){
printf("%s\n",a[i]);
}
}
}
return 0;
}
四、字符串的增、删、改、查。
AC代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
char a[50];
int main(){
char b;
gets(a);
int n=strlen(a);
scanf("%c",&b);
int index=-1;//保存找到的下标
if(b=='D'){//删除第一次出现的字符(具体示例看题目描述)
char c;
scanf(" %c",&c);//注意去除输入流中的回车符
for(int i=0;i<n;i++){
if(a[i]==c){
index=i;//找到该字符后,标记其下标
break;
}
}
for(int i=index;i<n;i++){
a[i]=a[i+1];//找到该字符后,从此位置开始让后面的字符前移一个位置即可完成删除操作
}
}
else if(b=='I'){//插入在最后一个字符的前面
char d,e;
scanf(" %c %c",&d,&e);
for(int i=n-1;i>=0;i--){//倒序查找最后一个字符
if(a[i]==d){
index=i;
break;
}
}
for(int i=n+1;i>index;i--){
a[i]=a[i-1];//找到该字符后,从最后一个字符到该字符让所有元素后移一个位置让index空出
//来即可完成插入操作
}
a[index]=e;//最后将空出来的位置赋值即可
}
else{//替换全部字符
char d,e;
scanf(" %c %c",&d,&e);
for(int i=0;i<=n;i++){
if(a[i]==d){
a[i]=e;//遍历找到后直接替换即可
index=i;
}
}
}
if(index!=-1)
puts(a);
else
printf("Not exist\n");
return 0;
}
注:数组初始化
1.全局变量
2.for(int i=0;i<len;i++)
b[i]=0;
3.memset(b,0,sizeof(b));(按照内存初始化,较快)