C语言 字符数组

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?";

puts(str);

printf("%s",str);

(2)、gets(字符数组名):

从键盘输入一个字符串到字符数组中,只能输入一个字符串(空格表示结束)

char str[100];

gets(str);

printf("%s\n",str);

(3)、strcat(字符数组1,字符数组2)  

比较常用,需要掌握  【程序运行的时候必须加入头文件:#include<string.h>】

连接两个字符数组中的字符串,把字符串2连接到字符串1后边,结果放在字符数组1中。是把右边的连接到左边的后边。

说明:

1、字符数组1必须要足够大,能否容纳连接后的新字符串(就是说,str1的数组长度 必须大于 str1+str2 的长度)

2、连接之前两个字符串后面都有一个 \0 ,连接时,将字符串1 后面的 \0 取消掉了,连接后只在新字符串最后保留一个  \0

char str1[10]= "one";

char str2[10]= "two";

strcat(str1,str2);   // 结果是 str1 ="onetwo"

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

将字符串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<string.h>】

比较字符串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个字节

  • 14
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值