Day11、字符串及字符串函数
2016-08-11 20:58
113 查看
不可以使用操作符操作字符串
C语言里提供了一组标准函数用来操作字符串,需要string.h头文件
Strlen 统计字符串里的有效字符个数(和sizeof计算结果不同)
4 charstr[]="abcdef";
5 printf("有效字符个数是%d\n",strlen(str));
6 printf("sizeof(str)是%d\n",sizeof(str));
结果:有效字符个数是6
sizeof(str)是7
4 char str[10]="abcdef";
5 printf("有效字符个数是%d\n",strlen(str));
6 printf("sizeof(str)是%d\n",sizeof(str));
执行结果: 有效字符个数是6
sizeof(str)是10
strcat 合并两个字符串
char str[20]="abcdef";
printf("%s\n",strcat(str,"xyz"));
printf("%s\n",str);
执行结果:abcdefxyz
Abcdefxyz
这个函数有可能修改不属于数组的存储区,造成严重错误
Strncat 功能和strcat类似,但可以避免修改不属于数组的存储区
printf("%s\n",strncat(str,"opqlmn",4)); 最后4 是只加几个字符
strcmp 用来比较两个字符串的内容(ASCII码)
返回值是1表示前一个字符串大,返回值是-1表示后一个字符串大,返回值是0表示一样大 printf("%d\n",strcmp("abc","abd")); 返回-1
Strncmp 用来比较前两个字符串的前n个字符printf("%d\n",strncmp("abc","abd",2));
strcpy 把一个字符串复制到字符数组里
char str[20]="abcdef";
printf("%s\n",strcpy(str,"xyz")); 执行结果:xyz (全部覆盖)
这个函数也可能修改不属于数组的存储区
Strncpy 功能和strcpy类似,只复制字符串前n个字符
charstr[20]="abcdef";
printf("%s\n",strncpy(str,"tang",4));
执行结果: tangef
Memset 把字符数组中连续多个字符类型存储区填充成同一个字符
char str[20]="abcdef";
memset(str,'h',3);
printf("%s\n",str); 执行结果:hhhdef
strstr 在一个大字符串里查找小字符串的位置,如果找不到,则返回值是NULL(错误)
18 printf("%s\n",strstr("abcdefghigklmn","cde"));
19 printf("%p\n",strstr("abcdefghigklmn","cde"));
执行结果cdefghigklmn
0x80485b2
以下字符串相关函数不需要包含string.h头文件
Sprintf 功能和printf功能类似,只是结果被放在一个字符数组里成为一个字符串
3 char str[20]={0};
4 printf("%c %d %g\n",'r',23,4.5f);
5 sprintf(str,"%c %d %g\n",'r',23,4.5f); 把字符放在数组里
6 printf("%s\n",str); 显示出来
Sscanf 功能和scanf类似,只是数据是从字符串里获得 (把输入数字转成字符串方便以后使用)
1#include<stdio.h>
2int main(){
3 char str[20]={0};
4 char ch=0;
5 int num=0;
6 float fnum=0.0f;
7 // printf("%c %d %g\n",'r',23,4.5f);
8 sprintf(str,"%c %d %g\n",'r',23,4.5f);
9 // printf("%s\n",str);
10 // scanf("%c %d%g",&ch,&num,&fnum);
11 sscanf(str,"%c %d %g",&ch,&num,&fnum);
12 printf("%c %d %g \n",ch,num,fnum);
13 return 0;
14 }
执行结果:r 23 4.5
以下两个函数可以把字符串里的数字转换成数字类型,需要stdlib.h头文件
Atoi 把字符串里不带小数点的数字转换成整数类型
Atof 把字符串里带小数点的数字转换成浮点类型
1#include<stdio.h>
2#include<stdlib.h>
3int main(){
4 intnum=atoi("08tan1g");
5 floatfnum=atof("34.65tang");
6 printf("%d %g\n",num,fnum);
7 return 0;
8 } 执行结果: 8 34.65
练习:记录一组学生成绩,遇到负数停止输入,显示结果为10,20,30,…
1#include<stdio.h>
2#include<string.h>
3int main(){
4 int grade=0;
5 charstr[50]={0},tmp[10]={0};
6 while(1){
7 printf("请输入一个考试成绩: ");
8 scanf("%d",&grade);
9 if(grade<0){
10 break;
11 }
12 sprintf(tmp,"%d,",grade);//把当前成绩转换成字符串
13 strcat(str,tmp);//把新考试成绩字符串加到结果字符串的末尾
14 }
15 str[strlen(str)-1]=0;
16 printf("结果是%s\n",str);
17 }
可以在scanf函数调用语句中调用%s占位符把用户在键盘输入的字符串记录到字符数组里
1#include<stdio.h>
2int main(){
3 char buf[10]={0};
4 printf("请输入一组字符串: ");
5 scanf("%s",buf);
6 printf("%s\n",buf);
7 return 0;
8 }
当输入字符串中有空格时,例abcdef , 只能输出abc 遇空格停止输出
或当输入超过10个时,造成错误。
fgets函数可以从键盘得到字符串并记到字符数组里,这个函数可以避免scanf函数的问题
需要三个参数:
1.数组名称 2.数组里的存储区个数 3.用stdin表示键盘
1#include<stdio.h>
2int main(){
3 char buf[10]={0};
4 printf("请输入一组字符串: ");
5 fgets(buf,10,stdin);
6 printf("%s\n",buf);
7 return 0;
8 }
如果输入内容不够多,就会把最后输入的换行字符也放到字符数组里。
如果输入内容超出数组能容纳的范围,就把后面的内容留给下次读取
1#include<stdio.h>
2int main(){
3 char buf[10]={0};
4 printf("请输入一组字符串: ");
5 fgets(buf,10,stdin);
6 printf("%s\n",buf);
7 fgets(buf,10,stdin);
8 printf("%s\n",buf);
9 return 0;
10 }
执行结果:请输入一组字符串:abfasdfawwefewafgeds
abfasdfaw
wefewafge (下一次自动把没输完的继续输出)
改进:
1#include<stdio.h>
2int main(){
3 char buf[10]={0};
4 printf("请输入一组字符串: ");
5 fgets(buf,10,stdin);
6 scanf("%*[^\n]");// 清除输入的多余数据
7 scanf("%*c"); // 清除输入的多余数据
8 printf("%s\n",buf);
9 fgets(buf,10,stdin);
10 printf("%s\n",buf);
11 return 0;
12 }
但是如果输入字符过少,则等待输入多余数据,这样不行、所以需要放入分支
应该在每次从键盘得到字符串以后把输入缓冲区里可能村长仔的多余数据丢掉,只有在确定输入缓冲区里有多余数据的时候,才应该清理它们
1#include<stdio.h>
2#include<string.h>
3int main(){
4 char buf[10]={0};
5 printf("请输入一组字符串: ");
6 fgets(buf,10,stdin
4000
);
7 if(strlen(buf)==9&&buf[8]!='\n'){
8 scanf("%*[^\n]");
9 scanf("%*c");
10 }
11 printf("%s\n",buf);
12 printf("请输入一组字符串: ");
13 fgets(buf,10,stdin);
14 printf("%s\n",buf);
15 return 0;
16 }
练习:编写模拟登陆程序
给用户三次登陆机会
只要有一个用户名和密码都正确就算登陆成功
每次登陆完都要给出相应提示
正确用户名:admin 正确密码:123456
1#include<stdio.h>
2#include<string.h>
3int main(){
4 char arr[8]={0};
5 int num=0;
6 for(num=1;num<=3;num++){
7 printf("请输入帐号 ");
8 fgets(arr,8,stdin);
9 if(strlen(arr)==7&&arr[6]!='\n'){
10 scanf("%*[^\n]");
11 scanf("%*c");
12 }
13 if (strcmp(arr,"admin\n")){
14 printf("用户名错误\n");
15 continue;
16 }
17 printf("请输入密码 ");
18 fgets(arr,8,stdin);
19 if(strlen(arr)==7&&arr[6]!='\n'){
20 scanf("%*[^\n]");
21 scanf("%*c");
22 }
23 if (strcmp(arr,"123456\n")){
24 printf("密码错误\n");
25 continue;
26 }
27 break;
28 }
29 if(num<=3){
30 printf("登陆成功");
31 }
32 else{
33 printf("登陆失败");
34 }
35 return 0;
36 }
1#include<stdio.h>
2#include<string.h>
3int main(){
4 int num=0,num1=0,num2=0;
5 char name[10]={0};
6 char mima[10]={0};
7 for(num=0;num<=2;num++){
8 printf("请输入帐号:");
9 fgets(name,10,stdin);
10 if(strlen(name)==9&&name[8]!='\n'){
11 scanf("%*[^\n]");
12 scanf("%*c");
13 }
14 printf("请输入密码:");
15 fgets(mima,10,stdin);
16 if(strlen(mima)==9&&mima[8]!='\n'){
17 scanf("%*[^\n]");
18 scanf("%*c");
19 }
20 if(strcmp(name,"admin\n")==0&&strcmp(mima,"123456\n")==0){
23 printf("登陆成功\n");
24 break;
25 }
26
27 else{
28 printf("登陆失败\n");
29 continue;
30 }
31 }
32 if(num==3){
33 printf("退出登陆");
34 }
35
36 return 0;
37 }
指针数组中的每个存储区都是一个指针
字符指针数组中每个存储区都是一个字符类型指针,每个字符类型指针都可以用来表示一个字符串
可以用字符指针数组表示多个相关字符串
定义指针字符串: char *arr={“abc”,”defgh”,”hjkl”};
里面有3个元素,每个元素是一个字符串
1#include<stdio.h>
2int main(){
3 char*strs[]={"abc","defgh","xyz"};
4 int num=0;
5 for(num=0;num<=2;num++){
6 printf("%s\n",strs[num]);
7 }
8 return 0;
9 }
执行结果:abc
defgh
xyz
#define预处理指令用来定义宏
定义宏时将宏名称写在前面,所代表的数字写在后面
宏名称通常由大写字母构成,名称中间不能含有空格
1#include<stdio.h>
2#define PI 3.14f
3int main(){
4 int radius=0;
5 printf("请输入半径: ");
6 scanf("%d",&radius);
7 printf("周长是%g",2*PI*radius);
8 return 0;
9 }
编译器在编译时会用宏代表的数字代替宏名称
主函数形式参数举例:
练习:编写程序解决鸡兔同笼问题
从命令中得到头和脚的个数
1#include<stdio.h>
2#include<stdlib.h>
3int main(int argc, char *argv[]){ //从输入指令中提取字符串
4 int heads=0,legs=0,num=0;
5 if(argc<3){ //若输入字符串个数小于3 ,因为./a.out算一个字符串
6 printf("命令错误\n");
7 return 0;
8 }
9 heads=atoi(argv[1]); //输入的第2个字符串转成整型数字 (40)
10 legs=atoi(argv[2]); //输入的第3个字符串转成整型数字 (100)
11 for(num=0;num<=heads;num++){
12 if(4*num+2*(heads-num)==legs){
13 printf("兔子有%d只,鸡有%d只\n",num,heads-num);
14 }
15 }
16 return 0;
17 }
执行结果: 输入指令./a.out 40 100
输出: 兔子有10只,鸡有30只
Ps :输入的指令./a.out 40 100 是用char *argv[ ] 定义的3个字符串,
C语言里提供了一组标准函数用来操作字符串,需要string.h头文件
Strlen 统计字符串里的有效字符个数(和sizeof计算结果不同)
4 charstr[]="abcdef";
5 printf("有效字符个数是%d\n",strlen(str));
6 printf("sizeof(str)是%d\n",sizeof(str));
结果:有效字符个数是6
sizeof(str)是7
4 char str[10]="abcdef";
5 printf("有效字符个数是%d\n",strlen(str));
6 printf("sizeof(str)是%d\n",sizeof(str));
执行结果: 有效字符个数是6
sizeof(str)是10
strcat 合并两个字符串
char str[20]="abcdef";
printf("%s\n",strcat(str,"xyz"));
printf("%s\n",str);
执行结果:abcdefxyz
Abcdefxyz
这个函数有可能修改不属于数组的存储区,造成严重错误
Strncat 功能和strcat类似,但可以避免修改不属于数组的存储区
printf("%s\n",strncat(str,"opqlmn",4)); 最后4 是只加几个字符
strcmp 用来比较两个字符串的内容(ASCII码)
返回值是1表示前一个字符串大,返回值是-1表示后一个字符串大,返回值是0表示一样大 printf("%d\n",strcmp("abc","abd")); 返回-1
Strncmp 用来比较前两个字符串的前n个字符printf("%d\n",strncmp("abc","abd",2));
strcpy 把一个字符串复制到字符数组里
char str[20]="abcdef";
printf("%s\n",strcpy(str,"xyz")); 执行结果:xyz (全部覆盖)
这个函数也可能修改不属于数组的存储区
Strncpy 功能和strcpy类似,只复制字符串前n个字符
charstr[20]="abcdef";
printf("%s\n",strncpy(str,"tang",4));
执行结果: tangef
Memset 把字符数组中连续多个字符类型存储区填充成同一个字符
char str[20]="abcdef";
memset(str,'h',3);
printf("%s\n",str); 执行结果:hhhdef
strstr 在一个大字符串里查找小字符串的位置,如果找不到,则返回值是NULL(错误)
18 printf("%s\n",strstr("abcdefghigklmn","cde"));
19 printf("%p\n",strstr("abcdefghigklmn","cde"));
执行结果cdefghigklmn
0x80485b2
以下字符串相关函数不需要包含string.h头文件
Sprintf 功能和printf功能类似,只是结果被放在一个字符数组里成为一个字符串
3 char str[20]={0};
4 printf("%c %d %g\n",'r',23,4.5f);
5 sprintf(str,"%c %d %g\n",'r',23,4.5f); 把字符放在数组里
6 printf("%s\n",str); 显示出来
Sscanf 功能和scanf类似,只是数据是从字符串里获得 (把输入数字转成字符串方便以后使用)
1#include<stdio.h>
2int main(){
3 char str[20]={0};
4 char ch=0;
5 int num=0;
6 float fnum=0.0f;
7 // printf("%c %d %g\n",'r',23,4.5f);
8 sprintf(str,"%c %d %g\n",'r',23,4.5f);
9 // printf("%s\n",str);
10 // scanf("%c %d%g",&ch,&num,&fnum);
11 sscanf(str,"%c %d %g",&ch,&num,&fnum);
12 printf("%c %d %g \n",ch,num,fnum);
13 return 0;
14 }
执行结果:r 23 4.5
以下两个函数可以把字符串里的数字转换成数字类型,需要stdlib.h头文件
Atoi 把字符串里不带小数点的数字转换成整数类型
Atof 把字符串里带小数点的数字转换成浮点类型
1#include<stdio.h>
2#include<stdlib.h>
3int main(){
4 intnum=atoi("08tan1g");
5 floatfnum=atof("34.65tang");
6 printf("%d %g\n",num,fnum);
7 return 0;
8 } 执行结果: 8 34.65
练习:记录一组学生成绩,遇到负数停止输入,显示结果为10,20,30,…
1#include<stdio.h>
2#include<string.h>
3int main(){
4 int grade=0;
5 charstr[50]={0},tmp[10]={0};
6 while(1){
7 printf("请输入一个考试成绩: ");
8 scanf("%d",&grade);
9 if(grade<0){
10 break;
11 }
12 sprintf(tmp,"%d,",grade);//把当前成绩转换成字符串
13 strcat(str,tmp);//把新考试成绩字符串加到结果字符串的末尾
14 }
15 str[strlen(str)-1]=0;
16 printf("结果是%s\n",str);
17 }
可以在scanf函数调用语句中调用%s占位符把用户在键盘输入的字符串记录到字符数组里
1#include<stdio.h>
2int main(){
3 char buf[10]={0};
4 printf("请输入一组字符串: ");
5 scanf("%s",buf);
6 printf("%s\n",buf);
7 return 0;
8 }
当输入字符串中有空格时,例abcdef , 只能输出abc 遇空格停止输出
或当输入超过10个时,造成错误。
fgets函数可以从键盘得到字符串并记到字符数组里,这个函数可以避免scanf函数的问题
需要三个参数:
1.数组名称 2.数组里的存储区个数 3.用stdin表示键盘
1#include<stdio.h>
2int main(){
3 char buf[10]={0};
4 printf("请输入一组字符串: ");
5 fgets(buf,10,stdin);
6 printf("%s\n",buf);
7 return 0;
8 }
如果输入内容不够多,就会把最后输入的换行字符也放到字符数组里。
如果输入内容超出数组能容纳的范围,就把后面的内容留给下次读取
1#include<stdio.h>
2int main(){
3 char buf[10]={0};
4 printf("请输入一组字符串: ");
5 fgets(buf,10,stdin);
6 printf("%s\n",buf);
7 fgets(buf,10,stdin);
8 printf("%s\n",buf);
9 return 0;
10 }
执行结果:请输入一组字符串:abfasdfawwefewafgeds
abfasdfaw
wefewafge (下一次自动把没输完的继续输出)
改进:
1#include<stdio.h>
2int main(){
3 char buf[10]={0};
4 printf("请输入一组字符串: ");
5 fgets(buf,10,stdin);
6 scanf("%*[^\n]");// 清除输入的多余数据
7 scanf("%*c"); // 清除输入的多余数据
8 printf("%s\n",buf);
9 fgets(buf,10,stdin);
10 printf("%s\n",buf);
11 return 0;
12 }
但是如果输入字符过少,则等待输入多余数据,这样不行、所以需要放入分支
应该在每次从键盘得到字符串以后把输入缓冲区里可能村长仔的多余数据丢掉,只有在确定输入缓冲区里有多余数据的时候,才应该清理它们
1#include<stdio.h>
2#include<string.h>
3int main(){
4 char buf[10]={0};
5 printf("请输入一组字符串: ");
6 fgets(buf,10,stdin
4000
);
7 if(strlen(buf)==9&&buf[8]!='\n'){
8 scanf("%*[^\n]");
9 scanf("%*c");
10 }
11 printf("%s\n",buf);
12 printf("请输入一组字符串: ");
13 fgets(buf,10,stdin);
14 printf("%s\n",buf);
15 return 0;
16 }
练习:编写模拟登陆程序
给用户三次登陆机会
只要有一个用户名和密码都正确就算登陆成功
每次登陆完都要给出相应提示
正确用户名:admin 正确密码:123456
1#include<stdio.h>
2#include<string.h>
3int main(){
4 char arr[8]={0};
5 int num=0;
6 for(num=1;num<=3;num++){
7 printf("请输入帐号 ");
8 fgets(arr,8,stdin);
9 if(strlen(arr)==7&&arr[6]!='\n'){
10 scanf("%*[^\n]");
11 scanf("%*c");
12 }
13 if (strcmp(arr,"admin\n")){
14 printf("用户名错误\n");
15 continue;
16 }
17 printf("请输入密码 ");
18 fgets(arr,8,stdin);
19 if(strlen(arr)==7&&arr[6]!='\n'){
20 scanf("%*[^\n]");
21 scanf("%*c");
22 }
23 if (strcmp(arr,"123456\n")){
24 printf("密码错误\n");
25 continue;
26 }
27 break;
28 }
29 if(num<=3){
30 printf("登陆成功");
31 }
32 else{
33 printf("登陆失败");
34 }
35 return 0;
36 }
1#include<stdio.h>
2#include<string.h>
3int main(){
4 int num=0,num1=0,num2=0;
5 char name[10]={0};
6 char mima[10]={0};
7 for(num=0;num<=2;num++){
8 printf("请输入帐号:");
9 fgets(name,10,stdin);
10 if(strlen(name)==9&&name[8]!='\n'){
11 scanf("%*[^\n]");
12 scanf("%*c");
13 }
14 printf("请输入密码:");
15 fgets(mima,10,stdin);
16 if(strlen(mima)==9&&mima[8]!='\n'){
17 scanf("%*[^\n]");
18 scanf("%*c");
19 }
20 if(strcmp(name,"admin\n")==0&&strcmp(mima,"123456\n")==0){
23 printf("登陆成功\n");
24 break;
25 }
26
27 else{
28 printf("登陆失败\n");
29 continue;
30 }
31 }
32 if(num==3){
33 printf("退出登陆");
34 }
35
36 return 0;
37 }
指针数组中的每个存储区都是一个指针
字符指针数组中每个存储区都是一个字符类型指针,每个字符类型指针都可以用来表示一个字符串
可以用字符指针数组表示多个相关字符串
定义指针字符串: char *arr={“abc”,”defgh”,”hjkl”};
里面有3个元素,每个元素是一个字符串
1#include<stdio.h>
2int main(){
3 char*strs[]={"abc","defgh","xyz"};
4 int num=0;
5 for(num=0;num<=2;num++){
6 printf("%s\n",strs[num]);
7 }
8 return 0;
9 }
执行结果:abc
defgh
xyz
#define预处理指令用来定义宏
定义宏时将宏名称写在前面,所代表的数字写在后面
宏名称通常由大写字母构成,名称中间不能含有空格
1#include<stdio.h>
2#define PI 3.14f
3int main(){
4 int radius=0;
5 printf("请输入半径: ");
6 scanf("%d",&radius);
7 printf("周长是%g",2*PI*radius);
8 return 0;
9 }
编译器在编译时会用宏代表的数字代替宏名称
主函数形式参数举例:
练习:编写程序解决鸡兔同笼问题
从命令中得到头和脚的个数
1#include<stdio.h>
2#include<stdlib.h>
3int main(int argc, char *argv[]){ //从输入指令中提取字符串
4 int heads=0,legs=0,num=0;
5 if(argc<3){ //若输入字符串个数小于3 ,因为./a.out算一个字符串
6 printf("命令错误\n");
7 return 0;
8 }
9 heads=atoi(argv[1]); //输入的第2个字符串转成整型数字 (40)
10 legs=atoi(argv[2]); //输入的第3个字符串转成整型数字 (100)
11 for(num=0;num<=heads;num++){
12 if(4*num+2*(heads-num)==legs){
13 printf("兔子有%d只,鸡有%d只\n",num,heads-num);
14 }
15 }
16 return 0;
17 }
执行结果: 输入指令./a.out 40 100
输出: 兔子有10只,鸡有30只
Ps :输入的指令./a.out 40 100 是用char *argv[ ] 定义的3个字符串,
相关文章推荐
- gets()、puts()函数。字符串函数。字符串排序的例子。
- 支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
- 【C Primer Plus】第十一章 字符串和字符串函数(一)
- 第十一章 字符串与字符串函数
- PHP 字符串函数 之 字符串处理类型函数
- C语言学习笔记:19_数组-字符数组与字符串(常用字符串函数)
- C字符串操作:查找字符串函数strstr()
- WinAPI 字符及字符串函数(9): lstrcat - 合并字符串
- 字符串和字符串函数 常用字符串函数
- 第十一章 字符串和字符串函数(字符串标准输入输出库函数)总结 140525
- 《C prime plus (第五版)》 ---第11章 字符串和字符串函数
- 【C语言学习】《C Primer Plus》第11章 字符串和字符串函数
- C Primer Plus 第十一章——字符串和字符串函数
- WinAPI 字符及字符串函数(10): lstrcpy - 复制字符串
- 统计单词(分割字符串,字符串函数的应用)
- MySQL字符串函数 字符串大小写转换
- C学习笔记(七)字符串与字符串函数
- day11 字符串函数、宏定义
- MySQL字符串函数:字符串截取
- MySQL 字符串函数:字符串截取