文章目录
前言
C语言的基本数据类型中没有字符串类型,通常要用字符数组来存储字符串。字符串在实际问题中应用非常广泛。
一、字符数组
字符数组的定义与一维数组相同,一般形式如下:
char 数组名 [ 常量表达式 ] ; //定义一维字符数组
char 数组名 [ 常量表达式 1 ] [ 常量表达式 2 ] ; //定义二维字符数组
例如:
char string [10] ;
char string [3][10];
上面定义了字符数组string[10]和string[3][10]。string[10]是可以储存10个字符的一维字符数组,如果结尾字符是'\0',代表这是一个字符串;string[3][10]是一个二维字符数组,表示三行十列,每行都可以存储一个字符串,共可以存储3个字符串,每行字符串都包含10个字符。
如果提供的初始值字符个数比事先定义的数组长度小,则只将这些字符赋给数组中前面那些元素,其余的自动被定义为空字符(即'\0')。
需要注意的是,由于字符型数据是以整数形式(ASCII代码)存放的,因此也可以用整型数组来存放字符数据。例如:
int c[10];
c[0]='H';c[1]='e';c[1]='1';
这样赋值是合法的,但是很浪费空间。如果定义成char型,则每个字符占1字节;但是如果定义成int型,用整型空间存储字符,则每个存储单元就要占据4字节。
Example:我们可以通过输入一个字符串“I love 优快云”,在输出到显示屏上。
#include<stdio.h>
int main()
{
char string[12];
int i;
for(i=0;i<12;i++)
scanf("%c",&string[i]);
for(i=0;i<12;i++)
printf("%c",string[i]);
return 0;
}
【运行结果】
I love 优快云
I love 优快云
字符数组同一维数值型数组一样,需要先定以后使用。字符数组的引用与普通数组的引用完全相同,需要用数组下标来引用对应的数组元素。
单个字符的输入/输出除了scanf()和printf()结合格式符%c,还有另一个对专门只针对字符的输入/输出函数:getchar()和putchar()。getchar()函数用于从终端输入一个字符,输入的字符可以是任意的ASCII码字符(包含回车符);putchar(ch)函数用于将另一个字符ch输出到终端。
Example:用单个字符输入/输出函数输入一个字符并输出到屏幕上。
#include<stdio.h>
int main()
{
char ch;
int i;
ch=getchar();
putchar(ch);
putchar('\n');
return 0;
}
二、字符串
字符串常量是由双引号引起来的字符序列,例如:
“hello world!” “优快云”
字符串常量和字符常量的差别在于,编译系统会在每个字符串的后面自动加上一个空操作符'\0',作为字符串结束标记。字符数组里存储的都是单个字符,字符数组的重要作用就是存储和处理字符串,但是一个字符数组存储的并不一定就是字符串,仅当其最后一个元素是'\0'时才表示字符串。'\0'是字符串结束的标志,输出是不会显示到屏幕上,他在内存中占1字节,但不计入字符串的实际长度,只计入数组的长度。在定义字符数组时,要考虑到2,如果存储的是一个字符串,则数组长的就要大于实际字符串的长度,至少多留一个'\0'的存储单元。例如,要存储“china”字符串,需要定义的字符数组长度至少是6.
利用字符数组对字符串进行初始化的方式如下:
char s[]={"I love math"};
或者简写成:
char s[]="I love math";
按照上面的语句初始化后,字符串在内存中的存储方式如下:
I | l | o | v | e | m | a | t | h | '\0' | ||
s[0] | s[1] | s[2] | s[3] | s[4] | s[5] | s[6] | s[7] | s[8] | s[9] | s[10] | s[11] |
因此,下面两个赋值语句是不同的。
char str[]={'C','S','D','N'};
char str[]={"CSND"};
后者的数组长度比前者大1,'\0'在初始化时不需要放在字符串后,输出时也不显示在屏幕上。但它作为字符串结束标志会自动加在字符串结尾,占据一个字符空间。
若字符数组定义时没有同步进行初始化,如果后面想赋值,则只能对单个字符元素赋值,不能整体赋值。下面的赋值是错误的:
char str[20];
str="优快云";
只能对单个赋值,如:
str[0]='C';str[1]='S';str[2]='D';str[3]='N';
如果在程序运行中想高效便捷地一次性输出字符串,则可以使用scanf()函数结合字符串格式符%s实现,输出函数则用printf()结合格式符%s实现。
Example:从键盘输入一个字符串,并将其输出到屏幕上。
#include<stdio.h>
int main()
{
char str[20];
scanf("%s",str); //str前面不需要加&,由于str是数组名,数组名就是数组的首地址
printf("%s",str);
return 0;
}
【运行结果】
【结果1】
student
student
【结果2】
today is Thursday
today
由于printf()是从首地址开始输出,输出过程中会逐个检查字符,如果遇到'\0'就会立刻结束输出。所以会出现【结果2】中的输出。同时,在scanf()中也是,遇到空格就会当作字符串输入分隔符,因此scanf()里面碰到空格就结束。
三、字符串处理函数
由于字符串特殊性,很多常规操作与数值型数据的处理方法不同,而是由专门的字符串处理数组。C语言字符串处理函数库提供了很多有用的函数,如字符串赋值,连接等。若要使用这些函数,必须在程序的开头将头文件<string.h>包含到源文件中。常见字符串处理函数如下:
(1)gets(str):从终端输入一个字符串到字符数组str,输入回车结束(空格可读入数组)如
char str[20];
gets(str);
(2)puts(str):将字符串str或字符串常量输出到终端,遇到'\0'则结束。如:
char str[20]="china";
puts(str);
//或者puts("china");
(3)strlen(str):求字符串str的实际长度,即不包括'\0'的实际字符数,遇到'\0'则结束。如:
char str[20]="china";
printf("%d",strlen(str));
//输出结果是5
(4)strcpy(str1,str2):将字符串str2复制到字符串str1中,全部覆盖str1的内容,要求str1的长度要大于或等于str2。如:
char s1[100];
char s2[]={"test"};
puts(strcpy(s1,s2));
//输出结果:test
(5)strcmp(str1,str2):比较两个字符串str1和str2的大小,str1和str2可以是字符串常量,也可以是字符数组名。用二者的ASCII码从左往右逐一比较,直到遇到第一各不相同的字符或字符串结束标志'\0',ASCII码大则该字符串大。
比较结果如下:
str1大于str2,返回值为正整数;
str1等于str2,返回值为负整数;
str1小于str2,返回值为0;
char s1="math";
char s2="man";
n=strcmp(s1,s2);
//n结果为1
n=strcmp(s1,"math");
//n结果为0
n=strcmp("com",s2);
//n结果为-1
(6)strcat(str1,str2):将字符串str2连接到字符串str1,合并成一个字符串,存储到str1中,要求定义时str1的大小能放下连接后的字符串,两个字符串中任意一个均可以是字符串常量。如:
char s1[100]="Hello";
char s2[]="world!";
puts(strcaat(s1,s2));
//输出结果为 Hello world!
(7)strncpy(s1,s2,n):将s2最前面的n个字符复制到s1中,取代s1中原有的n个字符,但复制的字符个数n不应多于s1中原有的字符(不包括'\0').如:
char s1[]="teach";
char s2[]="health";
strncpy(s1,s2,3);
puts(s1);
//输出结果为 heach
(8)strlwr(str):将字符串str中的大写字母转化为小写字母。如:
char str[]="BeiJing";
puts(strlwr(str));
//输出结果为:beijing
(9)strupr(str):将字符串str中的大写字母转化为大写字母。如:
char str[]="BeiJing";
puts(strupr(str));
//输出结果为:BEIJING
好的,到这就结束了,希望大家多多评论点赞鼓励。