字符数组
概念
元素类型为char字符型的数组,字符数组往往是用来存储字符串数据的。C语言中,字符是字节字符。
字节字符:一个字符占一个字节,在C语言中,使用char表示字节
char a = 'A';
char b = '1';
char c = 65;
//以上都是正确的
char d = "A";
char e = '司';
//以上都是错误的
语法
char 数组名[容量]
char 数组名[行容量][列容量]
字符数组的语法就是一维二维数组的语法
如果我们的char数组初始化时没有完全赋完值,空出来的地方使用\0进行填充
案例
注意:
①如果定义时不初始化,元素值不确定
char arr1[2]; //此时属于未初始化,元素值是不确定的(随机的) char arr2[5] = {'a','b','c'}; //此时属于不完全初始化,未初始化的元素使用\0进行填充
②如果提供的字符个数大于数组的长度,则按语法错误处理;如果字符个数小于数组长度,后面的元素自动为空字符(\0)
③如果提供的字符个数与数组的长度相同时,可省略数组长度,系统会自动确定元素个数,适合字符个数较多时。
字符串和字符串结束标志
说明
- C语言规定,字符串以字符
\0
作为结束标志
char c[8] = {'a','b','c','\0','\0','\0','\0','\0'};
- 编译系统对字符串常量自动加一个
\0
作为结束标志 - 程序中往往通过判断
\0
来检测字符串是否结束 \0
的ASCII码为0,不是一个可显示的字符,是"空操作符",什么都不做,不会增加有效字符,仅是一个供判别的标志
字符数组的多样表示
char数组可以以数组的方式一个个输出每个字符,char数组也可以以字符串的方式整体进行输出所有字符
#include <stdio.h>
int main()
{
char s1[] = {'h','e','l','l','o',' ','w','o','r','l','d'};
char s2[] = {"hello world"};
char s3[] = "hello world";
}
注意:
- 字符串的长度与字符数组的长度不一定相同
- 利用字符串常量可以对字符数组进行初始化,但不能用字符串常量为字符数组赋值
字符串的基础操作
在用格式说明符%s进行输入输出时,其输入输出项均为数组名。但在输入时,相邻两个字符串之间要用空格分隔,系统自动在字符串最后加结束符"\0",在输出时,遇到结束符"\0"作为输出结束标志。
对于字符串的操作,需要使用到一些系统提供的函数
字符串输入
scanf
scanf("%s",数组名);
例子:
/**
*字符串的输入
*语法:scanf("%s",数组名);
*/
void test1()
{
//创建一个char数组,用来存放人的名字
char name[20];
printf("请输入您的姓名:\n");
scanf("%s",name); //注意:如果是字符串,这里不是变量地址,是变量名i
printf("您的姓名是%s\n",name);
strcpy(name,"I LOVE YOU!");
printf("%s\n",name);
}
注:采用scanf()进行字符串输入,要求字符串中不能存在空格,否则字符串遇到空格会结束
fgets
fgets(数组名,数组容量,stdin)
功能:
从键盘录入一个字符串到字符数组,返回字符数组的地址
说明:
采用fgets进行字符串输入,可获取所有输入的字符串,包括\n
,在实际的字符串处理时,可能需要处理\n
/**
*字符串的输入
*语法:fgets(数组名,数组容量,sdtin);
*/
void test2()
{
//创建一个char数组,用来存放人的名字
char name[20];
printf("请输入您的姓名:\n");
fgets(name,sizeof(name)/sizeof(char),stdin);
printf("您的姓名是%s\n",name);
}
注意:
- 如果输入的字符串不包括
空格
和换行
,可以使用scanf()|fgets(); - 如果输入的字符串包括
空格
和换行
,只能使用fgets();
字符串输出
printf
printf("%s",数组名);
例子
/**
*字符串的输出
*语法:printf("%s",数组名);
*/
void test3()
{
//创建一个char数组,用来存放人的名字
char name[20];
printf("请输入您的姓名:\n");
fgets(name,sizeof(name)/sizeof(char),stdin);
//字符串输出
printf("您的姓名是%s\n",name);
}
puts
puts(数组名)
功能:
输出一个字符串
说明:
字符串中可以包含转义字符
例子:
/**
*字符串的输出
*语法:puts(数组名);
*/
void test4()
{
//创建一个char数组,用来存放人的名字
char name[20];
printf("请输入您的姓名:\n");
fgets(name,sizeof(name)/sizeof(char),stdin);
puts(name); //无法进行拼接,只能输出
}
字符串拼接
strcat
strcat(数组名,"需要拼接的字符串")
引用:
#include <string.h>
例子:
/**
*字符串的拼接
*语法:strcat(目标字符串,"需要拼接的字符串");
*/
void test5()
{
//创建一个char数组,用来存放人的名字
char name[20];
printf("请输入您的姓名:\n");
fgets(name,sizeof(name)/sizeof(char),stdin);
puts(strcat(name," 快跑!")); //无法进行拼接,只能输出
}
注:
-
目标字符串
的长度必须足够大,以便于能容纳被链接的字符串 -
链接后系统将自动取消
目标字符串
后面的结束符\0
-
链接字符串
可以是字符数组名,也可以是字符串常量
字符串拷贝
strcpy
strcpy(数组名,"字符串"),
引入:
#include <string.h>
说明:
这个函数适合给字符串赋值用
例子:
/**
*字符串的拷贝
*语法:strcpy(目标字符串,"字符串");
*/
void test6()
{
//创建一个char数组,用来存放人的名字
char name[20];
printf("请输入您的姓名:\n");
fgets(name,sizeof(name)/sizeof(char),stdin);
strcpy(name,"ZAQ");
puts(strcat(name,"快跑!")); //无法进行拼接,只能输出
}
字符串比较
strcmp
strcmp(字符串1,字符串2)
引入:
#include <string.h>
功能:
比较两个字符串对应位置字符ASCII的大小(字典比较)。
返回值:
若字符串1等于字符串2,则返回0
若字符串1大于字符串2,则返回正数
若字符串1小于字符串2,则返回负数
说明:
- 执行这个函数时,自左到右逐个比较对应的ASCII的值,直到发现了不同字符或字符串结束符
\0
为止 - 对字符串不能用数值型比较符
- 字符串1与字符串2可以是字符数组名,也可以是字符串常量
例子
/**
*字符串的比较
*语法:strcmp(字符串1,字符串2);
*/
void test7()
{
//创建一个char数组,用来存放人的名字
char username[20],password[8];
printf("请输入您的账户:\n");
scanf("%s",username);
printf("请输入您的密码:\n");
scanf("%s",password);
if(strcmp(username,"admin") && strcmp(password,"123456"))
{
printf("登陆成功!\n");
}
else
{
printf("账户或者密码错误!\n");
}
}
获取字符串长度
strlen
strlen(字符串)
引用:
#include <string.h>
注:
返回字符串中包含的字符的实际个数,不含\0
例子
/**
*字符串的长度
*语法:strlen(字符串);
*/
void test8()
{
//创建一个char数组,用来存放人的名字
char username[20];
printf("请输入您的账户:\n");
scanf("%s",username);
//获取字符串长度
size_t len = strlen(username);
if(!strcmp(username,"admin")
{
printf("账户输入成功!%lu\n",len);
}
else
{
printf("账户输入错误!%lu\n",len);
}
}
标签:字符,name,C语言,char,数组,printf,字符串
From: https://blog.csdn.net/Are_pro_bald/article/details/144542710