C语言-字符串数组
数组
字符串基础操作
字符串输入
scanf(中间不能有空格)
scanf("%s",数组名);
注:数组名对应的数组只能是char类型,从控制台输入字符串,默认后面自动加/0
#include <stdio.h>int main(){//创建一个char数组char name[20];printf("请输入您的姓名:\n");scanf("%s",name);printf("您的姓名是:\n");printf("%s",name); return 0;}
请输入您的姓名:张三 六您的姓名是:张三--------------------------------Process exited after 12.93 seconds with return value 0请按任意键继续. . .
用scanf的时候,字符串不能又空格,否则遇见空格会结束
fgets(中间可以有空格)
fgets(数组名 数组长度 stdin);
#include <stdio.h>int main(){//创建一个char数组char name[20]; //只是创建数组,必须指定容量;如果初始化,可以省略容量//计算数组容量int len =sizeof(name) / sizeof(name[0]);printf("请输入您的姓名:\n");fgets(name,len,stdin);printf("您的姓名是:%s\n",name);return 0;}
请输入您的姓名:张三 六您的姓名是:张三 六--------------------------------Process exited after 6.638 seconds with return value 0请按任意键继续. . .
gets 危险的【C11移出】
gets(数组名);
从键盘录入一个字符串常量到字符数组,返回字符数组的地址(首地址,默认返回的地址,一般用12位16进制数表示)
采用gets进行字符串输入,可获取所有输入的字符串,包含 \n ,在实际的字符串处理时,我们可能需要处理 \n
#include <stdio.h>int main(int argc,char *argv[]){// 创建一个字符数组,用来存储姓名char name[20]; // 只是创建数组,必须指定容量;如果初始化,可以省略容量。// 计算数组容量int len = sizeof(name) / sizeof(name[0]);printf("请输入您的姓名:\n");gets(name);printf("您的姓名是%s\n", name);return 0;}
字符串输出
printf
printf("转义字符",数组名);
例:
#include <stdio.h>int main(int argc,char *argv[]){// 创建一个字符数组,用来存储姓名char name[20]; // 只是创建数组,必须指定容量;如果初始化,可以省略容量。// 计算数组容量int len = sizeof(name) / sizeof(name[0]);printf("请输入您的姓名:\n");fgets(name, len, stdin);printf("您的姓名是%s\n", name);.// %s支持字符串常量,也支持字符数组,都是以字符串形式输出return 0;}
fput
fputs(数组名,stdout);
#include <stdio.h>int main(){char a[] = "hi xiaoming\neat!\n";//第一种输出printf("%s",a);//第二种输出fputs(a,stdout);return 0;}
hi xiaomingeat!hi xiaomingeat!--------------------------------Process exited after 0.1254 seconds with return value 0请按任意键继续. . .
puts 危险的【C11】
puts(数组名);
#include <stdio.h>int main(){char a[] = "hi xiaoming\neat!\n";//第一种输出printf("%s",a);//第二种输出fputs(a,stdout);//第三种输出puts(a);return 0;}
字符串相关函数
字符串拼接
strcat(字符数组,需要拼接的字符串或者字符数组或者字符指针);
解释:
参数1必须是字符数组;参数2可以是字符数组,也可以是字符串常量,还可以是字符指针
这里的参数2拼接到参数1,所以参数1要有足够大的空间来容纳参数2
#include <string.h>
例:将两个字符串拼接为一个字符串
//字符串1:足够大的空间char name[20];//字符串2--UTF-8 :一个汉字占3个字节,占总字节数:3(字节)*4(字数)+1(回车产生\n)+1(字符串默认\0) = 14--GBK :一个汉字占2个字节,占总字节数:2(字节)*4(字数)+1(回车产生\n)+1(字符串默认\0) = 10
#include <stdio.h>#include <string.h>int main(){char a[20];char name[20]; //用来容纳控制台输入printf("请输入您的名字:\n");//输入,fgets支持空格输入 fgets(name,sizeof(name)/sizeof(name[0]),stdin);//输出,拼接后的东西 fputs(strcat(name,"你好!"),stdout); return 0;}
字符串拷贝
strcpy(数组名,字符串);
错误:
#include <stdio.h>#include <string.h>int main(){char name[50] = "张三1"; //用来容纳控制台输入printf("打印初始化的数组:%s\n",name);name = "张思2"; //数组一旦创建,就无法改变,所以不能对数组进行赋值 printf("%s\n",name);return 0;}9 [Error] assignment to expression with array type
正确函数运用:
strcpy(数组名,"参数");
例:
#include <stdio.h>#include <string.h>int main(){char name[50] = "张三1"; //用来容纳控制台输入printf("打印初始化的数组:%s\n",name);strcpy(name,"张思2"); //数组一旦创建,就无法改变,所以不能对数组进行赋值 printf("打印修改后的数组:%s\n",name);return 0;}
注(strcat与strcpy)
char a[20] = "┭┮﹏┭┮"; //正确,字符数组的初始化char b[20] = "┭┮﹏┭┮"; b = "柳柳"; //错误,不能对数组进行赋值char a[20] = "三三"; strcpy(a,"琪琪"); //正确,利用函数实现类似赋值的操作
strcat: 三三 + 丝丝 -> 三三丝丝(追加)
strcpy:三三 + 丝丝 -> 丝丝 (覆盖)
字符串比较
strcmp(字符串1,字符串2);
如果字符串1 等于 字符串2,返回0
如果字符串1 大于 字符串2,返回正数(>0)
如果字符串1 小于 字符串2,返回负数(<0)
#include <stdio.h>#include <string.h>int main(){char username[20],password[8];printf("----------用户登录---------\n"); printf("请输入您的用户名:\n");scanf("%s",username); //数组名本身就是一个地址(首元素的首地址)printf("请输入您的密码:\n");scanf("%s",password);//校验if(!strcmp(username,"三三")&&!strcmp(password,"123456")) //相等:strcmp (..) == 0{printf("登录成功!\n");}else{printf("用户名或着密码错误!\n"); }}
字符串长度(strlen)
strlen(字符串);
#include <stdio.h>#include <string.h>int main(){char a[] = {'a','i','\0','e','r','\0'};printf("数组长度:%lu\n字符串长度:%lu\n",sizeof(a)/sizeof(a[0]),strlen(a)); // 6 2printf("\n");char b[] = {"ai\0er\0"}; //使用双引号包裹的为字符串常量,后面默认会有一个结尾的\0 printf("数组长度:%lu\n字符串长度:%lu\n",sizeof(b)/sizeof(b[0]),strlen(b)); // 7 2printf("\n");char c[] = {'h','e','l','l','o'}; //strlen()判断一个字符串的长度,优先判断是否存在\0, 如果不存在,就返回数组实际长度printf("数组长度:%lu\n字符串长度:%lu\n",sizeof(c)/sizeof(c[0]),strlen(c)); // 5 5printf("\n"); //不安全,不同编译器可能前面的结果不同 char d[] = "aill";printf("数组长度:%lu\n字符串长度:%lu\n",sizeof(d)/sizeof(d[0]),strlen(d)); // 5 4printf("\n"); }
例:输入一行英文,查找其中有多少个单词
#include <stdio.h>#include <ctype.h>int main(){char a[100];//word:统计字符是空字符(空字符;0,非空字符;1);num:用来统计单词个数int num = 0,word = 0;//创建一个变量,用来存储遍历到的字符char b;printf("请输入一句话:");//通过控制台录入字符串 fgets(a,sizeof(a)/sizeof(a[0]),stdin);//遍历for(int i = 0;(b = a[i]) !='\0';i++){if(isspace(b)) //判断一个字符是否为空格,等价于 if(c == ' ') 需要引入"ctype.h"头文件 {//如果是空格标记word = 0; }else{//如果上一个字符是空格,就需要统计单词if(!word) //等价于 word == 0 {// 标记word为非空格word = 1;//统计单词个数num++; } }}printf("%s\n中有%d个单词",a,num); return 0;}
例:有三个字符串,要求找出其中最大者
#include <stdio.h>#include <string.h>int main(int argc,char *argv[]){// 创建一个数组,用来存储最大的字符串char max[50];// 创建一个数组,用来存储3个用来参与比较的字符串char str[3][50]/* = {"apple","orange","egg"}*/;int i;// 通过循环控制台输入printf("请输入3个测试字符串:\n");for (i = 0; i < 3; i++){fgets(str[i],50,stdin);}// 比较if (strcmp(str[0],str[1]) > 0) strcpy(max, str[0]);else strcpy(max,str[1]);if (strcmp(str[2],max) > 0) strcpy(max,str[2]);printf("\n三个字符串中最大的字符串是%s\n!", max);return 0;}