c语言定义字符串数组例子(c语言数组初始化赋值)

c语言定义字符串数组例子(c语言数组初始化赋值)

一、字符数组

在程序开发中经常要对字符串进行存储和处理操作,在C语言中就用字符数组来处理字符串数据,就是类型为char的数组。

二、字符数组的定义

1.一般形式

1)一维字符数组定义

char数组名字[长度];

例如:

charc[10];

2)二维字符数组定义

char数组名字[一维数组长度][二维数组长度];

例如:

char c[5][6];

2.说明

1)字符型和整型可以通用,所以可以将char换成int。

但是所占的内存空间是不一样的,因为每个字符型数据占用一个字节,每个整型数据最少要占用两个字节空间。

2)C语言中用一维的字符数组存放一个字符串;用二维数组存放多个字符串,在用二维数组存放多个字符串的时候,二维数组的第一个下标决定存储字符串的个数,第二个下标说明存储字符的最大长度。

例如:

char array[20][50];

表示字符数组array可以存放20个字符串,每个字符串的最大长度为50个字符。

三、字符数组的初始化

1.一般形式

字符数组的初始化和其他类型数组的初始化是相同的,就是类型是固定的char型。

1)一维字符数组的初始化:

charc[10]={‘h’,’e’,’l’,’l’,’o’,’w’,’o’,’r’,’l’,’d’};

也可以写成如下形式:

char c[]=”helloword”;

两者的区别在于,后者C语言会自动在末尾上添加‘\0’这个结尾标识。

由于有了这个,字符串按后者赋值的时候,无须给出长度,系统会自动给定。

2)说明

上例中,一维数组的初始化值虽然相同,但二者在内存中所占的长度是不同的!

第一种方法,该一维数组的长度就是10。

但在第二种方法中,将一个字符串“helloword”赋给数组时,数组的长度不是10,而是11。因为“\0”也算一个字节。

即C语言中的字符串都是以空字符“\0”作为结尾标准,所以放入字符串的字符数组的长度至少要比该字符串的实际字符个数多一个字节,以存放“\0”。

四、字符数组的引用

字符数组的引用与其他类型一维数组和二维数组的引用是相同的。

在采用字符串方式后,字符数组的输入输出就更加简单和便捷了。

1.以“%s”格式输入输出字符数组的数据。

案例

输出一个字符串。

#include<stdio.h>void main() { char c[] = “helloworld”; printf(“%s\n”, c);}

分析:

也就是先定义一维的字符数组,然后通过输出语句printf,以%s的方式输出。

运行结果:

案例

数组的输入通过提示输入形式赋值给数组。

#include<stdio.h>void main() { char c[15]; printf(“请输入:\n”); scanf_s(“%s”, c, sizeof(c)); printf(“%s\n”, c); return 0;}

分析:

首先先定义一个长度为15的一维字符数组,然后通过scanf_s函数进行输入。

但这里好像是因为使用VS的原因,传统的scanf并不好使,反而需要用scanf_s。

至于sizeof(c)的作用是告诉编译器我要预留多少字节来存储这个字符串,c也就是数组c,会自动转换成预留的字符数。

如果不加这个,系统会报错,也是没谁了。

2.说明

1)通常scanf函数输入数据时不可以带有空格,如果有空格就被视为结束符。

而scanf_s()函数虽然按空格后不会立马结束,但按完回车后,就会发现,空格之后的字符不会被显示输出。

2)上面所定义的长度为15,所以输入字符串长度最多不能到15个,否则不会存储进字符数组中。

案例

输入3个人名字,名字按字母顺序排列输出。

编程思路:3个名字应由一个二维字符数组来处理。

然而C语言规定可以把一个二维数组当成多个一维数组处理。

因此本题又可以按3个一维数组处理,而每一个一维数组就是一个人名字字符串。

C语言的的编译环境给出了很多库函数,本例中可以直接加载字符串比较函数strcmp()和字符串赋值函数strcpy(),比较各一维数组的大小,并排序,输出结果即可。

程序代码如下:

#include<stdio.h> //格式输入输出函数头文件//#include<conio.h> //getch()函数的头文件//#include<stdlib.h> //清屏函数头文件//#include<string.h>//strlen()字符串长度,strcmp字符串比较的头文件void main() { char st[20],cs[3][20]; int i, j, p; printf(“请输入3个人名字:\n”); //以二维数组的形式 for (i = 0; i < 3; i ) { gets(cs[i]); } printf(“\n”); //对比 for (i = 0; i < 3; i ) { p = i; strcpy(st, cs[i]); for (j = i 1; j < 3; j ) { if (strcmp(cs[j], st) < 0) { p = j; strcpy(st, cs[j]); } } if (p != i) { strcpy(st, cs[i]); strcpy(cs[i], cs[p]); strcpy(cs[p], st); } puts(cs[i]); } printf(“\n”); //return 0;}

分析:

或许是VS最新编译器的关系?即便不声明头文件也能使用相应函数。

然后这里是先定义了一个一维数组和一个二维数组,并且二维数组中可以存储3个一维数组,实现3个名字的存储。

然后通过for循环,gets(cs[i])函数方式,放里面输入。

再然后就是入了对比环节。

因为有3个名字,所以需要对比3次,因此也就作为外循环循环3次。

然后就是内部,首先将p作为一个“旗帜”,用于下面条件是否成立后的“数组元素的位置颠倒”.

而strcpy(st, cs[i]);函数,则是将表达式2的数组,复制拷贝到表达式1中。

接下来的for循环,就是使用strcmp(cs[j], st)函数,再配合if语句进行比较,如果数组前面的元素<数组后面的元素,就会输出-1,从而执行if语句里面的。

将p=j,较小的数组元素则拷贝到st数组中。

然后这里就是使用“旗帜p”的效果了,只要p与i不相等,与就证明执行了上面的判断,st就变成了较小的字母,并与前面的数组元素进行调换。

而这里使用的则是strcpy()函数的拷贝赋予的方式。

然后就是每一次外循环结束时,将其所在的数组元素输出。

运行结果:

由于是通过拼音的首字母,按照英文字母进行排序,所以得出的结果就是ABC。

发表评论

登录后才能评论