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
连接两个字符数组中的字符串,把字符串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
将字符串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个字节
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)