决不要停止自学,也不要忘记,不管你已经学到了多少东西,已经知道了多少东西,知识和学问是没有止境的一鲁巴金
字符数组
字符数组就是用于存放字符型数据的数组。在C语言中,字符串是作为字符数组来处理的,没有专门的字符串变量。字符串十分常用,因此C语言提供了许多专门处理字符串的函数。
字符数组的定义
字符数组是用于存放字符变量的数组,每个数组元素存放一个字符。字符数组的定义和数值型数组类似:
char 数组名[常量表达式];
与数值型数组相同,需要使用下标来访问字符数组元素,下标值0开始。
字符数组在内存中的存储
由于字符型和整型通用,也可以使用整型数组来存放字符数据,但这样浪费空间。同样也可以定义二维字符数组。
b[0] | b[1] | .... | b[5] | ..... | b[9] |
1 | h | y |
字符数组的初始化
1.对数组元素逐个赋初值,这个方法与数值型数组类似
char c[10]={'c','v','b'};
最后一个数组元素没有赋初值,自动赋值为空字符(即'\0',其ASCII的值为0,是一个非打印字符)
2.用字符串初始化,c语言规定,可以将字符串直接赋值给字符数组用于初始化。
char c[12]={"hello world"};
事实上在实际运用过程中常省略花括号,甚至省略数组长度
char c[]={"hello world"};
注:存储长度为字符串中字符个数+1,因为'\0'作为结束字符也占一个长度。
字符数组只有在初始化时才能将整个字符串一次性地赋值,一定义完,就只能逐个字符赋值。
字符串与字符串结束标志
C语言中,用双引号引起来的内容为字符串常量。没有专门用于存储字符串变量的类型,字符串被存储在以空字符('\n')结尾的char类型的数组中。空字符用来标记字符串结束的位置,因此'\ 0'也被称为字符串结束标志或者字符串结束符。0'是ASCII码表中的第0个字符,英文称为NUL,中文称为“空字符”。该字符既不能显示,也没有控制功能,输出该字符不会有任何效果。有了空字符作为字符串的结束符,就不必再以字符数组的长度来判断字符串的长度值得注意的是逐个字符地给数组赋值初始化并不会自动添加'\0',需要我们人为地添加。
字符数组的引用和输入与输出
- 字符数组的引用
字符数组的引用即字符数组元素的引用,如同字符型变量的使用,可以被赋值,参与表达式运算或进行输入输出。例如:
char c[5];
c[0]='c';
c[4]=c[2]+5;
for(i=0;i<5;i++)
c[i]='a'+i;
for(i=0;i<5;i++)
printf("c[%d]=%c",i,c[i]);
我们可以使用for语句逐个输出同时在C标准库中也为我们提供了一些函数为我们整体输入输出,在下面的文章中我会写到。
字符串的输入
scanf()函数
使用scanf()函数和转换符%s可以读取字符串,读取时以第一个非空白符作为字符串的开始,以下一个空白符作为字符串的结束。空白符包括空行,空格,制表符或换行符。
char a[6];
scanf("%s",a);
注:scanf()函数的输入项a是一个已定义的字符数组名,输入的字符串应该短于定义的长度,系统自动加'\0',如果输入内容过长,scanf()也会造成数据溢出。此时我们可以指定宽度来防止溢出如:%10s
特别注明:在VS编译器中因为安全性问题在实际使用中我们需要使用是scanf_s()代替,具体使用方法类似,同样我们也可以使用#define _CRT_SECURE_NO_WARNINGS来忽略该问题。
get()函数
在我们使用scanf()函数进行输入时每次只能输入一个字符并且当遇到空格时输入就停止了,为了让我们可以一次性输入一个句子gets()函数就诞生了,事实上C11标准委员会已经将其废除在VS2022中我们已经不能使用了,这里我们介绍2了一些它的替代品。
fgets()函数
char *__cdecl fgets(char *_Buffer, int _MaxCount, FILE *_Stream)
它含有三个参数,其中第2个参数指明了读入字符的最大数量(特别注明包括'\0'),第三个参数指明要读入的文件,如果读入从键盘输入的数据,则以stdin1(stdin是C语言中标准输入流,一般用于获取键盘输入到缓冲区里的东西)作为参数,该标识符定义在stdio.h中。例如:
#include<stdio.h>
int main ()
{
char a[SIZE];
fgets(a,10,stdin);
fputs(a,stdout);
return 0;
}
gets_s()函数
char *__cdecl gets_s(char *_Buffer, rsize_t _Size)
它包含两个参数,第二个参数为读入字符的最大数量。
注:gets_s()只从标准输入中读取数据,所以不需要第3个参数,如果gets_s()读到换行符,会直接将其丢弃而不是储存,如果gets_s()读到最大字符数都没有读到换行符,会执行以下几步。首先把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直至读到换行符或文件结尾,然后返回空指针。接着,调用依赖实现的“处理函数”(或你选择的其他函数),可能会中止或退出程序。
字符串的输出
printf()函数
使用转换说明符%s即可输出字符串,输出时遇见结束符'\0'即停止输出。
#include<stdio.h>
int main()
{
char a[] = "China";
printf("%s", a);
return 0;
}
puts()函数
用于将一个字符串或一个字符数组中存放的字符串(以'\0'结束的字符序列)输出到终端,并在末尾自动添加一个换行符,puts()函数常与gets()函数配对使用。
#include<stdio.h>
int main()
{
char a[20] = "Input a string ";
puts(a);
fgets(a, 10, stdin);
puts("This string is");
puts(a);
return 0;
}
注:puts()函数在遇见空字符时会停止输出,因此要确保含有空字符
char a[]={"a","c"}
//这种情况是不会自动添加'\0'
字符串处理函数
C语言函数库提供了多个处理字符串的函数,最常用的函数包括strlen(),strcpy(),strncpy(),strcat(),strcmp(),strlwr()和strupr()。其函数原型在头文件string.h中。
strlen()函数
strlen()函数用于统计字符串的长度,即字符串中包含的字符个数,但不包括字符串结束符'\0'。字符串可以是字符数组,也可以是字符串常量
unsigned int strlen(char*str);//函数原型
#include<stdio.h>
int main()
{
char str[20];
fgets(str,20,stdin);
printf("Length of\"%s\"is%d.\n", str, strlen(str));
printf("Length of\%s\is%d.","abcdefg",strlen("abcdefg"));
return 0;
}
注:输出双引号时采用了转义字符的表达方式
strcpy()函数和strncpy()
字符数组与数值型数组一 样,不能进行整体赋值和复制,只能对数组元素逐个赋值或复制 如果希望整体复制可以使用strcpy()函数
strcpy(字符数组1,字符数组2);
char* strcpy (char* szCopyTo, const char* szSource);
//函数原型
注:strcpy()函数用于将字符串或字符数组赋值到字符数组1中,包括赋值串后的字符串结束符'\0'。
strcpy()函数不会检查目标空间是否有足够容纳源字符串,而strncpy()可以指定复制的最大字符数。
stmcpy(字符数组1,字符串2,最大长度)
char* stmepy (char* szCopyTo, const char* szSource, int n);
函数原型
注: 如果字符串2的字符数小于n,那么复制整个字符串(包括空字符);复制的最大长度不能超过n,如果字符串2的字符数大于等于n,那么只复制前n个字符,不会复制空字符。空字符不一定要复制,需要时可以手动添加一个即可。
#define _CRT_SECURE_NO_WARNINGS//添加原因见上方
#include<stdio.h>
#include<string.h>
int main()
{
char str1[20], str2[20] = "hello world";
strncpy(str1, str2, 5);
str1[5] = '\0';
puts(str1);
return 0;
}
strcat()函数
strcat()函数用于将字符串2连接到字符数组1的字符串后面,并返回字符数组1的起始地址,字符串2保持不变,它可以是字符数组或字符串常量。
strcat(字符数组1,字符数组2);
char*strcat (char* szAddTo, const char* szAdd);
//函数原型
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char str1[20], str2[10];
printf("strl:");
fgets(str1,20,stdin);
printf("str2:");
fgets(str2, 20, stdin);
strcat(str1, str2);
printf("str1: %s", str1);
return 0;
}
注:strcat()函数不会检查字符数组 1的空间是否足够,程序员应当保证字符数组1的长度足以连接字符串2,否则会发生越界错误。当连接时,将字符数组1中字符串结束符'0'去掉,将字符串2的各字符依次连接到字符数组1的末字符后,并在新字符串的末尾再加上字符串结束符'\0'。
strcmp()函数
strcmp()函数用于比较字符串,若两个字符串相同,则返回0;当字符串1大于字符串2时,则返回个正整数:当字符串1小于字符串2时, 则返回一个负整数。字符串的比较从各自第一个字符开始,并进行逐个一一对应比较(按字符的ASCII 码值大小进行)。若前面的对应字符相同,则继续往后比较,直到遇上第对不同的字符, 并以这对字符的大小作为字符串比较的结果。字符串1和字符串2可以是字符数组或字符串常量。
strcmp(字符串1,字符串2);
int strcmp (const char* sz1, const char* sz2);
//函数原型
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
printf("%d ",strcmp("abc", "abd"));
printf("%d ",strcmp("abcd", "abc"));
printf("%d ", strcmp("abc", "abc"));
return 0;
}
注:若"ab"<"abd",则strcmp("abc", "abd")返回负整数;若"abed"> "abe",则strcmp("abed","abe" )返回正整数;若"abe"自己与自己相等,则stremp("abc", "abe")返回 0。大多数情况下,stremp()函数用于比较两个字符串是否相等或按字母顺序排序,返回的值具体是多少 并不重要。
strlwr()函数和strupr()函数
strlwr()函数是用于将指定字符串中的大写字母转换成小写字母并返回。
strupr()函数是用于将指定字符串中的小写字母转换成大写字母并返回。
strlwr(字符串)
char* strlwr (char* szToConvert);
//函数原型
strupr(字符串)
char* strupr (char* szToConvert);
//函数原型
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char str[20];
fgets(str,10,stdin);
printf("%s\n", _strlwr(str));
fgets(str,20,stdin);
printf("%s\n", _strupr(str));
return 0;
}
最后的话 :如果大家觉得这篇文章对你们有帮助的话希望你们能够点点关注,你们的关注是我继续写下去的动力,谢谢大家。