数组(下)
字符数组
概念
元素类型为char字符型的数组,字符数组往往是用来存储字符串数据的。需要注意的一点是,我们C语言中的字符是字节字符。
字节字符:也就是一个字符占1个字节
测试题:
char a = 'A' // 正确
char b = '1' // 正确
char c = 65 // 正确 这是ASCII码编号,对应的值是 'A'
char d = "A" // 错误,这是字符串的写法,也是char数组的写法,char d[1] = "A"
char e = '马' // 错误,中文一个字符超过1一个字节
语法
char 数组名[容量];
char 数组名[行容量][列容量];
字符数组的语法就是之前所学一维数组和二维数组的语法,只不过数据类型是char而已。
注意:
如果我们的char数组初始化的时候,没有完全赋完值的时候,空出来的地方使用 \0 进行填充。
字符案例
案例1:
/**
* 需求:字符数组案例-输出一个字符串(I LOVE YOU!)
*/
#include <stdio.h>
int main()
{// 准备一个测试字符串 I LOVE YOU!char arr[11] = {'I',' ','L','O','V','E',' ','Y','O','U','!'};// 通过一个for循环进行遍历输出for(int i = 0;i < sizeof(arr)/sizeof(char);i++){printf("%c",arr[i]);}printf("\n");return 0;
}
案例2:
/**
* 需求:字符数组案例-输出一个用字符组成的菱形图案
*/
#include <stdio.h>
int main()
{// 准备数据char arr[5][5] = {{' ',' ','*',' ',' '},{' ','*',' ','*',' '},{'*',' ',' ',' ','*'},{'','*',' ','*',' '},{' ',' ','*',' ',' '}};// 遍历数组for(int i = 0;i < sizeof(arr)/sizeof(arr[0]);i++){for(int j = 0;j < sizeof(arr[i])/sizeof(char);j++){// 打印菱形printf("%c",arr[i][j]);}// 内层循环每结束一轮,就是一行printf("\n");}printf("\n");return 0;
}
字符串和字符串结束标志
说明
- C语言规定,字符串以字符’\0’作为结束标志
- 编译系统对字符串常量自动加一个’\0’作为结束标志
- 程序中往往通过判断’\0’来检测字符串是否结束
- '\0’的ASCII码为0,不是一个可显示的字符,是“空操作符”,什么都不做,不会增加有效字符,仅是一个供判别的标志
字符数组的多样表示
我们的char数组可以以数组的方式一个个输出每个字符;我们的char数组也可以以字符串的方式整体进行输出所有字符。具体如下面案例:
/*
需求:字符数组->字符串
*/
#include <stdio.h>
int main()
{// 字符串第1种表示:char s1[] = {'h','e','l','l','o',' ','w','o','r','l','d'};// 字符串第2种表示:char s2[] = {"hello world"};// 字符串第3种表示:char s3[] = "hello world";// 测试,使用字符串方式打印,这样就不用一一遍历printf("%s\n",s1);printf("%s\n",s2);printf("%s\n",s3);return 0;
}
注意
-
字符串的长度与字符数组的长度不一定相同。
-
利用字符串常量可以对字符数组进行初始化,但不能用字符串常量为字符数组赋值。
// 正确写法:利用字符串常量给字符数组初始化 char b[15] = "China"; // 错误写法:利用字符串常量给字符数组赋值 char b[15]; b[15] = "China";
字符串的基础操作
字符串输入
scanf函数
scanf(“%s”,数组名)
案例
/*
* 需求:字符数组-字符串的输入输出
*/
#include <stdio.h>
int main()
{// 创建一个变量,用来存放人的名字char name[20];printf("请输入您的姓名:\n");scanf("%s",name);// 如果是字符串,这里不是变量地址,是变量名printf("您的姓名是:%s\n",name);return 0;
}
注意:采用scanf进行字符串输入,要求字符串中不能存在空格,否则字符串遇到空格会结束。
fgets函数
fgets(数组名,数组容量,stdin);
说明:采用fgets进行字符串输入,可获取所有输入的字符串,包含 \n ,在实际的字符串处理时,我们可能需要处理 \n
案例:
/*
* 需求:字符数组-字符串的输入输出
*/
#include <stdio.h>
int main()
{// 创建一个变量,用来存放人的名字char name[20];printf("请输入您的姓名:\n");fgets(name,sizeof(name)/sizeof(char),stdin);// 输入,返回地址puts(name);// 输出return 0;
}
注意:
- 如果输入的字符串不包含 空格 和 换行 ,可以使用scanf() | fgets();
- 如果输入的字符串需要包含 空格 和 换行 ,只能使用fgets();
- 经过对比,我们发现,在字符串的输入中,fgets()更好;
字符串输出
put函数
puts(数组名);
案例:
/*
* 需求:字符数组-字符串的输入输出
*/
#include <stdio.h>
int main()
{// 创建一个变量,用来存放人的名字char name[20];printf("请输入您的姓名:\n");scanf("%s",name);puts(name);// 输出 问题?字符串如何拼接printf("您的姓名是:%s\n",name);return 0;
}
printf函数
printf(“%s”,数组名);
/*
* 需求:字符数组-字符串的输入输出
*/
#include <stdio.h>int main(){// 创建一个变量,用来存放人的名字char name[20];printf("请输入您的姓名:\n");scanf("%s",name);printf("您的姓名是:%s\n",name);return 0;
}
字符串操作
字符串拼接
strcat(数组名,“需要拼接的字符串”)
注意:需要引入 #include <string.h>
案例:
/*
* 需求:字符数组-字符串的输入输出
*/
#include <stdio.h>
#include <string.h>
int main()
{// 创建一个变量,用来存放人的名字char name[20];printf("请输入您的姓名:\n");fgets(name,sizeof(name)/sizeof(char),stdin);// 输入,返回地址puts(strcat(name," 跑着!"));// 拼接return 0;
}
字符串拷贝
strcpy(数组名,字符串)
注意:需要引入 <string.h>库
说明:这个方法适合给字符串赋值用。
char str[16] = "杰克" // 初始化,正确
char str[16]; str[16] = "杰克" // 赋值,错误
char str[16]; strcpy(str,"杰克") // 赋值,正确,结果:杰克
案例:
/*
* 需求:字符数组-字符串的输入输出
*/
#include <stdio.h>
#include <string.h>
int main()
{// 创建一个变量,用来存放人的名字char name[20];printf("请输入您的姓名:\n");scanf("%s",name);strcpy(name,"你好");printf("%s\n",name);// 输出return 0;
}
字符串比较
strcmp(字符串1,字符串2);
注意:
- 需要引入 <string.h>
- 返回的结果是boolean
案例:
/*
* 需求:字符数组-字符串的输入输出
*/
#include <stdio.h>
#include <string.h>
int main()
{// 创建一个变量,用来存放人的名字char username[20];printf("请输入您的账户:\n");scanf("%s",username);if(strcmp(username,"admin")){printf("账户输入错误!\n");}else{printf("账户输入正确!\n");}return 0;
}
获取字符串长度
strlen(字符串)
注意:
- 需要 <string.h>
- 返回字符串长度
案例:
/*
* 需求:字符数组-字符串的输入输出
*/
#include <stdio.h>
#include <string.h>
int main()
{// 创建一个变量,用来存放人的名字char username[20];printf("请输入您的账户:\n");scanf("%s",username);// 获取字符串长度unsigned long len = strlen(username);if(strcmp(username,"admin")){printf("账户输入错误!%lu\n",len);}else{printf("账户输入正确!%lu\n",len);}return 0;
}