c语⾔⼆维数组字符串赋值,C语⾔笔记(⼆)---数组、函数七、数组
在C语⾔中,数组属于构造数据类型。
数组根据元素的类型不同,数组⼜可以分为 数值数组 、字符数组 、指针数组 、结构数组 等各种类别。
本章介绍 数值数组 和 字符数组 。
1. ⼀维数组的定义和引⽤
定义: 类型说明符 数组名 [常量表达式];
例如:int a[10]; float b[10],c[20]; char ch[20];
下标从 0 开始;
不能在 [] 中使⽤变量来表⽰元素的个数,但是可以是符号常数或常量表达式。
引⽤:数组名[下标]
其中下标只能为整型常量或整数表达式。
如为⼩数时,C编译将⾃动取整。。
初始化
给数组赋值的⽅法除了⽤赋值语句对数组元素逐个赋值外,还可以采⽤初始化赋值和动态赋值的⽅法。
初始化赋值形式举例: int a[10]={0,1,2,3,4,5,6,7,8,9};
C语⾔对数组的初始化赋值有以下⼏点规定:
1)可以只给部分元素赋初值。当 {} 中的值的个数少于元素个数时,只给前⾯部分元素赋值。
例如:int a[10]={0,1,2,3}; 表⽰只给前⾯ 4个元素赋值。⽽后⾯的值⾃动赋 0 值。
2)只能给元素逐个赋值,不能给数组整体赋值。例如,给10个元素全部赋1值,只能写为:
int a[5]={1,1,1,1,1}; ⽽不能写为 int a[5]=1;
如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。例如:
int a[5]={1,2,3,4,5}; 可以写成 int a[]={1,2,3,4,5};
2. ⼀维数组程序举例:
main() {
int i,max,a[10];
printf("input 10 numbers:\n");
for (i=0;i<10;i++)
scanf("%d",&a[i]);
max=a[0];
for (i=1;i<10;i++)
if(a[i]>max) max=a[i];
printf("maxmum=%d\n",max);
}
例2:排序
main() {
int i,j,p,q,s,a[10];
printf("input 10 numbers:\n");
for (i=0;i<10;i++)
scanf("%d",&a[i]);
for (i=0;i<10;i++) {
p=i;q=a[i];
for(j=i+1;j<10;j++)
if(q
if(i!=p) {
s=a[i];
a[i]=a[p];
a[p]=s;
}
printf("%d",a[i]);
}
}
3. ⼆维数组的定义和引⽤
定义:类型说明符 数组名[常量表达式1][常量表达式2]
表达式1 为第⼀维下标的长度,
表达式2 是第⼆维下标的长度
例如:int a[3][4]; 说明了⼀个三⾏四列的数组,数组名为 a,其下标变量的类型为整型。
该数组的下标变量共有 3*4 个。
⼆维数组在概念上是⼆维的,但在实际的硬件存储器中却是连续编址的,也就是说存储器单元是按⼀维线性排列的。如何在⼀维存储器中存放⼆维数组,可有两种⽅式:
⼀种是按⾏排列,即放完⼀⾏之后顺次放⼊第⼆⾏。
另⼀种是按列排列,即放完⼀列后再顺次放⼊第⼆列。
在C语⾔中,⼆维数组是按⾏排列的。即:先存放 a[0] ⾏,再存放 a[1] ⾏,最后存放 a[2] ⾏。
⼆维数组的初始化
可以按⾏分段赋值,也可以按⾏连续赋值。
例如:
int a[5][3]={{80,75,92},{61,65,71},{59,63,80},...};
int a[5][3]={80,75,92,61,65,59,....};
对于⼆维数组初始化赋值的说明:
1)可以只对部分元素赋初值,未赋初值的元素⾃动取0值。
例如:
int a[3][3]={{1},{2},{3}}; 是对每⼀⾏的第⼀列元素赋初值,未赋值的元素为0.
2)如对全部元素赋初值,则第⼀维的长度可以不给出:例如:
int a[3][3]={1,2,3,4,5,6,7,8,9};
可以写为
int a[][3]={1,2,3,4,5,6,7,8,9};
数组是⼀种构造类型的数据。
⼆维数组可以看作是⼀维数组的嵌套⽽构成的,设⼀维数组的每个元素都⼜是⼀个数组,就组成了⼆维数组。
当然,前提是各元素类型必须相同。
根据这样的分析,⼀个⼆维数组也可以分解成多个⼀维数组。
C语⾔允许这种分解。如⼆维数组 a[3][4] 可以分解为 3 个⼀维数组,其数组名分别为:a[0] a[1] a[2] ,对这 3 个⼀维数组不需要另作说明就可以使⽤。
必须强调的是 a[0] a[1] a[2] 不能当作下标变量使⽤,他们是数组名,⽽不是⼀个单纯的下标变量。
4. 字符数组:
char c[10];
由于字符型和整型通⽤,也可以定义为 int c[10] ,但这时每个数组元素占2个字节的内存单元。
字符数组初始化的时候未赋初值的元素也是0值。
同样也可以在赋初值时省去数组长度。
5. 字符串和字符串结束标志:
在C语⾔中没有专门的字符串变量,通常⽤⼀个字符数组来存放⼀个字符串。
前⾯介绍字符串常量时,已说明字符串总是以 \0 做为串的结束符。
因此当把⼀个字符串存⼊⼀个数组时,也把结束符'\0'存⼊数组,并以此做为字符串是否结束的标志。
有了 \0 标志后,就不必再⽤字符数组的长度来判断字符串的长度了。
C语⾔允许⽤字符串的⽅式对数组作初始化赋值。例如:
char c[]=('C',' ','p',... }; 可写为: char c[]={"C program"}; 或去掉 {} ,写为 char c[]="C program";
\0是C编译系统⾃动加上的。
由于采⽤了 \0 标志,所以在⽤字符串赋初值时⼀般⽆需指定数组的长度,⽽由系统⾃⾏处理。
6. 字符数组的输⼊输出:
在采⽤字符串⽅式后,字符数组的输⼊输出将变得简单⽅便。
除了上述⽤字符串赋初值的办法外,还可以⽤ printf函数 和 scanf函数 ⼀次性输出输⼊⼀个字符数组中的字符串,⽽不必使⽤循环语句逐个地输⼊输⼊每个字符。例如:
main() {
char c[]="BASIC\nBASE";
printf("%s\n",c);
}
注意格式字符串 %s 表⽰输出的是⼀个字符串,⽽在输出表列中给出数组名即可,不能写为 printf("%s\n",c[]);
⼜如:
main() {
char st[15];
printf("input string:\n");
scanf("%s",st);
printf("%s\n",st);
}
本例中字符数组长度为15,因此输⼊的字符串长度必须⼩于15,以留出⼀个字节⽤于存放结束标志'\0'。
应该说明的是,对⼀个字符数组,如果不作初始化赋值,则必须说明数组长度。
还应该特别注意的是,当⽤ scanf函数 输⼊字符串时,字符串中不能含有 空格 ,否则将以 空格 做为串的结束符。
例如,当输⼊的字符串含有空格时,运⾏情况为:
input string:
this is a book
输出为:
this
从输出结果可以看出空格以后的字符都未能输出。
为了避免这种情况,可多设⼏个字符数组分段存放含有空格的串。
程序改写如下:
main() {
char st1[6],st2[6],st3[6],st4[6];
printf("input string:\n");
scanf("%s%s%s%s",st1,st2,st3,st4);
printf("%s %s %s %s\n",st1,st2,st3,st4);
}
前⾯介绍过,scanf 的各输⼊项必须以地址⽅式出现,如&a &b等。
但是现在却是以数组名⽅式出现的,这是为什么呢?
这是由于C语⾔中规定,数组名就代表了该数组的⾸地址。
整个数组是以⾸地址开头的⼀块连续的内存单元。如有字符数组 char c[10] ,在内存可表⽰如下: c[0] c[1] ... c[9]
设数组c的⾸地址为2000,也就是说 c[0] 单元地址为2000.则数组名c就代表这个⾸地址。
因此在c前⾯不能再加地址运算符 & 。
在执⾏ printf("%s",c) 时,按 数组名c 到⾸地址,然后逐个输出数组中的各个字符直到遇到字符串终⽌地址 \0 为⽌。
7. 字符串处理函数
使⽤输⼊输出的字符串函数时需要包含头⽂件 stdio.h,使⽤其他字符串函数应包含头⽂件 string.h 。
(1)字符串输出函数puts (字符数组名)
如 char c[]="BASIC\ndBASE"; puts(c);
从上⾯的例⼦可以看出puts函数中可以使⽤转义字符,因此输出结果为两⾏。
puts函数 完全可以由 printf函数 取代。
当需要⼀定格式输出时,通常使⽤ printf函数 。
(2)字符串输⼊函数gets (字符数组名)
例如:
#include "stdio.h"
main() {
char st[15];
printf("input string:\n");
gets(st);
puts(st);
}
可以看出当输⼊的字符串中含有空格时,输出仍为全部字符串。
说明 gets函数 并不以空格做为字符串输⼊结束的标志,⽽只以回车做为输⼊结束。
这是与 scanf函数 不同的。
(3)字符串连接函数strcat (字符数组名1,字符数组名2);
功能是把 字符数组2 中的字符串连接到 字符数组1 中字符串的后⾯,并删去字符串1后的串标志 \0。
本函数返回值是 字符数组1 的⾸地址。
例⼦:
#include "string.h"
main() {
static char st1[30]="My name is ";
int st2[10];
printf("input your name:\n");
gets(st2);
strcat(st1,st2);
puts(st1);
字符串比较函数实现}
上⾯的例⼦是初始化赋值的字符数组与动态赋值的字符串连接起来,要注意的是,字符数组1应定义⾜够的长度,否则不能全部装⼊被连接的字符串。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论