一、字符串的三种形式
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);
hdu 2027----统计音
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'没有存储位置。
hdu 2017----字符串统计
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,,同时,回车也不写入输入流中,但是此函数可能导致数组越界。
hdu 2026----首字母变大写
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; }
四、字符串的增、删、改、查。
TK 20886----字符串编辑
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));(按照内存初始化,较快)
今天的文章 字符串基础分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/80183.html