字符数组
定义字符数组
定义字符数组和数值型的数组格式是一样的,数据类型为char型。
如char a[10];这就定义了长度为10的数组,每个元素都存放一个字符。
字符数组的初始化
对字符的初始化,最容易理解的是用“初始化列表”,把各个字符一次赋给数组中的元素。
例如:char a[10] = {'I',' ','a','m',' ','h','a','p','p','y'};
把这十个字符一次赋给a[0]-a[9]。
如果定义字符数组不进行初始化,则数组中各个元素的值是不可预料的。如果花括号中字符的个数大于数组的长度则会出现语法错误。
如果字符的个数小于数组的长度,则将这些字符赋值给数组前面的元素,剩余的元素自动补位空字符(即’\0’)。
如果不定义数组的长度,系统会根据初值的个数自动判断数组的长度。
也可以定义和初始化一个二维数组。
如char dia[5][5]={{' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ',' ','*'},{' ','*',' ','*',' '},{' ',' ','*'}}
引用数组元素
单个元素的引用和之前是一样的,并且可以通过循环来连续输出字符得到字符串。
例:输出已知的字符串。
#include <stdio.h>
int main() {
char a[15] = {'I',' ','a','m',' ','a',' ','s','t','u','d','e','n','t'};
int i;
for(i = 0;i<15;i++){
printf("%c",a[i]);
}
printf("\n");
return 0;
}
运行结果:
字符串
在c语言中是没有字符串类型的,处理字符串时将字符串作为字符数组来处理,字符串的保存也是以字符数组的形式保存在内存中。
在处理字符串时,数组的长度会经常大于字符串的长度,比如定义了长度为100的字符数组,但是只有前40个字符组成的字符串是有效的,为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符’\0’,作为字符串的结束标志。数组从第一个元素开始一直到第一个’\0’的上一个,为有效的字符串。
所以在这个规则下,对于字符数组的初始化就又多了一种:
char c[] = {“I am happy”};
或者省略花括号:
char c[] = “I am happy”;
此时数组的长度为11,而不是10,因为系统在字符串的最后自动补’\0’,这也是一个字符需要占内存。
字符数组的输入输出
字符数组的输入输出有两种办法
1、逐个字符的输入输出,用格式符“%c”输入或输出一个字符。
2、将整个字符串一次输入或输出。用哪个“%s”格式符。
例如:char c[10]="china";ptintf("%s\n",c);
c | h | i | n | a | \0 | \0 | \0 | \0 | \0 |
输出时遇到’\0’就停止输出,输出结果为china。
要注意的是:
1、输出字符中不包括结束符。
2、用“%s“格式符输出字符串时,printf中的输出项是数组名而不是数组元素。
3、如果数组长度大于字符串的实际长度,只输出到遇见’\0’结束。
4、如果字符数组有多个’\0’,则遇见第一个就结束。
5、可以用scanf函数输入一个字符串。
如scanf("%s",c);
系统会在你输入的字符后面自动补’\0’,输入的字符中不能有空格,scanf函数在遇见空格时就不再继续输入。
字符串处理函数
1、puts函数——输出字符串函数
一般形式为:puts(字符数组)
作用是讲一个字符串(以’\0’结束的字符序列)输出到屏幕上。例如:
char a[] = "china";
puts(a);
2、gets函数——输入字符串函数
一般形式是gets(字符数组);
作用是从终端输入一个字符串到数组,并得到一个函数值,该函数值是字符数组的起始地址。例如:
char a[10];
gets(a);
gets函数与scanf函数的区别是scanf遇见空格就会停止导致数组里面不会有空格,而gets函数遇见换行才会停止,所以可以存在空格。
举个例子:
#include <stdio.h>
int main() {
char a[15];
scanf("%s",a);
puts(a);
gets(a);
puts(a);
return 0;
}
结果:
输入时,输入i后有一个空格,此时scanf结束,继续输入时就是gets函数在运行,直到回车后两句输出语句一起运行,第二行是第一个puts,第四行是第二个puts。图中的第三行并不是运行的结果,我使用的是xcode,警告在结果处显示,vc就不会有这个了。
3、strcat——字符串连接函数
使用strcat函数需要导入头文件string.h,作用是将两个字符数组中的字符串连接起来,并返回到一个新的数组。
格式:strcat(str1,str2); 将str2连接到str1后面
例如:给定两个数组str1,str2,将str2连到str1后面并将得到的字符串保存在str1中。
#include <stdio.h>
#include <string.h>
int main() {
char str2[10] = "Wuhan!";
char str1[100] = "fighting ";
strcat(str1, str2);
puts(str1);
return 0;
}
4、strcpy函数——字符串复制函数
需要导入string.h头文件,作用将str2的字符串复制到str1中去。
格式:strcpy(str1,str2);
注意,str1必须足够大以便容纳str2,也就是说str1的长度必须大于等于str2。
strcpy的第一个参数必须写成数组名的形式,第二个参数可以使数组名也可以是字符串常量。
例如:strcpy(str1,"china);
5、strcmp函数——字符串比较函数
需要导入string.h头文件,作用是比较str1和str2的大小,在字符串中不能使用比较符号来判断两个字符串的大小,必须使用strcmp函数来比较大小。
strcmp函数的运行过程是从字符串的第一个字符开始比较,如果相等则比较下一个元素,直到遇见第一个不等的字符,比较第一个不等的字符,结果就是整个字符串的比较结果,如果大于则返回一个正数,小于则返回一个负数,如果两个字符串完全相等则返回0。
例如:str1 = “china”,str2 = “chinA”,从第一个字符开始比较,‘c’、‘h’、‘I’、'n’都是相等的,到第五个字符时,‘a’>'A’所以str1>str2,那么strcmp(str1,str2)>0。要注意的是小写字母是大于大写字母的,因为比较字符大小时比较其ASCII码的大小,小写字母的ASCII大于大写字母的ASCII。
7、还有其他的一些字符串处理函数,比如测字符串长度的strlen函数,转换小写的strlwr函数,转换大写的strupr函数,这些函数都需要导入string.h头文件