1、字符数组:用来存放字符的数组,字符数组中的一个元素 存放一个字符。

例如:char c[10]; // c[0]….c[9]

c[0] =’I’;

c[1] =’ ‘;

c[2] =’a’;

c[3] =’m’;

c[4] =’ ‘;

c[5] =’h’;

c[6] =’a’;

c[7] =’p’;

c[8] =’p’;

c[9] =’y’;

2、字符数组的初始化:

a)、逐个字符赋给数组中的元素

char c[10] ={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’}; // c[0]—c[9]

b)、如果提供的初值个数和预定的数组长度相同,定义时可以省略数组长度,系统会自动根据初值个数确定数组长度

char c[] ={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’}; // c[0]—c[9]

c)、如果初值个数 大于 数组长度 ,则提示你语法错误

char c[8] ={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’}; 这里赋值了11个元素,但是数组长度只有8个

d)、初始个数 小于 数组长度,则只将这些字符赋值给数组中前面的哪些元素,其余的元素值会给 \0 ,也可能无法确定

char c[11] ={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’};

char dianmond[3][3]={{‘ ‘,’*’,’ ‘},{‘*’,’ ‘,’*’},{‘ ‘,’*’,”}};

int i,j;

for(i=0;i<3;i++)

{

for(j=0;j<3;j++)

{

printf(“%c”,dianmond[i][j]);

}

printf(“\n”);

}

char c[10] ={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’};

int i;

for(i=0;i<10;i++)

{

printf(“%c”,c[i]);

}

printf(“\n”);

3、字符串和字符串结束标记【重点】

(1)、如果提供的初值个数和预定的数组长度相同,定义时可以省略数组长度,系统会自动根据初值个数确定数组长度

char c[] ={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’}; // c[0]–c[9] —-c[10] 但是这里没有 \0 ,就可能会导致乱码

(2)、补充一个初始化字符数组的方法:用字符串常量来初始化字符数组

char d[] = {“I am happy”}; //系统会自动在字符串末尾增加一个 \0 ,叫做字符串结束标记。处置个数由10个,d[11]=\0;

字符串结束标记:用来标记一个字符串的结束。

为了测定一个字符串的实际长度,C语言规定了一个字符串结束标记,就是\0

如果一个字符串,它的第10个字符为:’\0’,此字符串的有效字符为 9 个。

也就是说,在遇到字符’\0’的时候,表示字符串结束,由’\0′ 前边的字符组成字符串。

例如:这个”I am happy”有10个有效字符,但是它在内存中占11个字节,因为最后一个字节是 ‘\0’

char c[11] =”I am happy”;

char d[100] = “I am happy”; //初值个数可以小于数组长度

char c[] ={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’,’\0′}; == char d[] ={“I am happy”};

注意:char c[] ={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’,’\0′}; (这种方法罕见)如果这里不写 ‘\0’,然后用%s字符串输出,就会在后面出现乱码

4、字符数组的输入和输出:

char c[]=”China”;

printf(“%s\n”); //%s 格式用来输出一个字符数组(字符串)

a、printf输出的字符串不包括 \0 (字符串结束标记)

b、%s 对应的是字符数组名 c

c、即便数组的长度 大于 字符串实际长度,也只输出到 \0 结束;

d、如果一个字符数组里面包含多个 \0 ,printf 也只是遇到第一个 \0 时就停止输出;

例如:c[2]=’\0′;

printf(“%s\n”,c); // 因为字符数组第三个数已经赋值为 \0 所以输出时遇到这个就结束,结果为:Ch

5、从键盘输入一个字符串,用 scanf 来完成

char c[100];

scanf(“%s”,c); // 从键盘输入一个字符串,c 时字符数组名 而且只能输入99个字符,系统会自动给你添加一个 \0

printf(“%s\n”,c); //scanf 函数在输入一个字符的时候不能加入空格,否则空格后的内容会被舍弃

char str[10],str2[10],str3[10];

scanf(“%s%s%s”,str1,str2,str3); // 可以同时输入多个字符串,中间用空格隔开;

这里没有使用 & ,因为str1 这个字符数组名,本身就代表该数组的起始地址。

&str1 与 str1 被等同看待,都被认为是数组的起始地址。

int a;

scanf(“%d”,&a); // & 是地址符号,地址就是数字,在电脑里面的内存地址,一般就用0xXXXXXXX.

在C语言中,一维字符数 就可以看成字符串变量

6、字符串处理函数

(1)、puts(字符串数组) :

将一个字符串输出到屏幕(能换行),注意只能输出一个字符串。相当于 printf 函数的作用

char str[100]=”Are you ok” />

(4)、strcpy(字符数组1,字符串2) 常用函数,必须用心掌握【程序运行的时候必须加入头文件:#include】

将字符串2 拷贝到 字符数组1 中去,字符数组1中的内容将被覆盖,不要搞反了,是把右边的内容往左边拷贝。

说明:

1、字符数组1 必须足够大,以便能容纳下被拷贝的字符串,也就是 字符数组1 的长度不能小于 字符串2 的长度。

2、字符数组1 必须是个数组名,字符串2可以是个数组名字,也可以是个字符串常量。

3、拷贝的时候是连同字符串后边的 \0 也一起拷贝到字符数组中去了

4、不能用赋值语句将一个字符串常量 或 字符数组直接赋给一个字符数组。

char str1[20] = “one1234”; //定义的时候可以初始化

char str2[15] = “two”;

strcpy(str1,str2); // str1 的大小,一定不要小于 str2

printf(“%s\n”,str1); //结果是:two

字符串不可以下面这样赋值(只有整型和实型可以):

str =”China”; //赋值语句:

str1 =str2;

赋值语句:只能将一个字符赋值给一个字符型变量或者数组元素

例如:char c1,a[5]; // 后续引用的时候能引用的只有 a[0] – a[4];

a[0]=’A’;

a[1]=’B’;

a[2]=’C’;

a[3]=’D’;

a[4]=’E’;

a[5]=’F’; // 这个会出现程序错误,[5]是不可以引用的

(5)、strcmp(字符串1,字符串2) 【程序运行的时候必须加入头文件:#include】

比较字符串1 和字符串2,也算是一个常用函数(这里比较的是内容,而不是内存地址)

1、如果字符串1 等于 字符串23,该函数返回0

2、如果字符串1 < 字符串2 ,返回一个正整数 大于0的数;

3、如果字符串2 > 字符串1,返回一个负整数,小于0的数;

比较规则:对两个字符串从左到右逐个字符比较(按照AscII码值大小比较),一直到出现不同的字符或者遇到 \0 为止。

如果全部字符相同,则认为相等,如果出现不相同的字符,则以第一个不相同的字符比较结果为准。

“abcde”

“abkef” //这里从 c k 字符开始就不相同了,所以把这两个字符进行比较大小,”abkef” >”abcde”

常用于比较,相等或者不相等,一般不用于比较大小。

int reco;

char str1[10] =”one1234″;

char str2[10]=”two1234″;

reco = strcmp(str1,str2);

printf(“%d\n”,reco); //输出结果为reco= -1

if(str1==str2) //如果这样比较的话比较的就是内存地址了。要比较内容的话就要使用上面第五个函数。

{

}

(6)、strlen(字符数组) **********这个是重点函数,常用***********

测试字符串长度的函数(遇到 \0 就停止了),函数的值字符串的实际长度,但是不包括 \0(字符串结束标记),返回的单位是字节(这里测试的是内容的长度,而不是类型的长度)

char str1[120]=”opel”; //4个字节

char str2[150]=”断点abc停在这”; //11个字节,一个汉字占两个字节,一个字母占一个字节

int len1 =strlen(str1); // 4

int len2 =strlen(str2); //11

特别注意:sizeof()操作符 : 是求所占的字节数,是求各种类型占的字节数

int a; //不管你a中保存的是什么内容

int soa=sizeof(a); //a所占的内存字节数,和a中保存的内容无关。4个字节

int sob=sizeof(int); //占4个字节

int bob=sizeof(double); //占8个字节

int streso =sizeof(str1); // 这里占120个字节,因为char 类型占120个字节