5.3 数组的输入和输出
5.3.1 数值数组的输入和输出
数值型数组的输入,一般用循环实现对各个元素逐个输入。例如,下面的程序段可实现一维数组的输入:
float x[10];
int i;
for(i=0;i<10;i++)
scanf("%f",&x[i]);
其中,x[i]前面一定要加上地址运算符“&”。
二维数组的输入则要用二重循环,如:
①按行的顺序输入
int a[3][4],i,j;
for (i=0;i<3;i++)
for (j=0;j<4;j++)
scanf("%d",&a[i][j]);
②按列的顺序输入
int a[3][4],i,j;
for(j=0;j<4;j++)
for(i=0;i<3;i++)
scanf(“%d”,&a[i][j]);
例5.1 将10个元素的整型数组a分两行输出。
#include <stdio.h>
main()
{ int i,a[10]=1,2,3,4,5,6,7,8,9,20;
for (i=0;i<10;i++)
{ printf("%2d",a[i]);
if (i%5==4||i==9)
printf("/n");
}
}
程序中增加了一个if语句,保证每打印完5个元素或者打印完最后一个元素后就换入下一行。
使用条件表达式代替if语句,则可使程序简单:
#include <stdio.h>
main()
{ int i,a[10]={1,2,3,4,5,6,7,8,9,10};
for(i=0;i<10;i++)
printf("%2d%c",a[i],(i%5==4||i==9)?'/n':' ');
}
上面两个程序运行结果相同,显示如下:
1 2 3 4 5
6 7 8 9 10
例5.2 按矩阵形式打印二维数组b[3][4]。
#include <stdio.h>
main()
{ int i,j;
float b[3][4]={1.2,2.2,3.4,4.4,5.6,6.6,7.6,
8.6,9.8,10.8,11.8,12.8};
for (i=0;i<3;i++)
{ for (j=0;j<4;j++)
printf("%6.2f",b[i][j]);
printf("/n");
}
}
程序运行结果为:
1.20 2.20 3.40 4.40
5.60 6.60 7.60 8.60
9.80 10.80 11.80 12.80
5.3.2 字符数组的输入和输出
1. 用scanf()和printf()实现字符数组的输入和输出
① 用“%c”控制的scanf()和printf()可以逐个输入和输出字符数组中的各个字符。例如
main()
{ int i;
char ch[10];
for (i=0;i<9;i++)
scanf(“%c”,&ch[i]);
for(i=0;ch[i]!=’/0’;i++)
printf("%c",ch[i]);
}
用这种方式输入时,可接收从键盘输入的字符数一定要比定义的长度少1。系统会自动将最后一个位置放入’/0’字符。输出时,可以用ch[i]!=’/0’来作为继续循环的条件。
② 用“%s”控制的scanf()和printf()输入和输出字符串。例如,程序段
char ch[16];
scanf("%s",ch);
printf("%s/n",ch);
我们注意到,在scanf()和printf()中都用了数组名ch,而没用地址运算符&。这是因为“%s”是直接控制字符串的,只要求某个字符串的起始地址作为参数;而且,当它用在scanf()时,会自动把用户输入的回车符转换成'/0'加在字符串的末尾,用在printf()时,遇到’/0’就结束输出。
特别要注意,“%s”用在scanf()中控制输入有一个弊端,就是输入的字符串不能含有空格或制表符。当“%s”遇到空格或制表符时就认为输入结束。例如,执行
scanf(“%s”,ch);
当从键盘输入
good morning
时,ch的值为“good”而不是“good morning”。解决这一弊端的办法是对输入长度加以限定,如:
scanf("%13s",ch);
这时,同样的输入可使ch的值为“good morning”。
“%s”用在printf()中,不会因为遇到空格或制表符而结束输出。
2. 字符串输入函数gets()和字符串输出函数puts()
用gets()可以直接输入字符串,直至遇到回车键为止,它不受输入字符中空格或制表符的限制。gets()的一般格式为
gets(字符型数组名);
用puts()可以输出字符串,而且自动把字符串末尾的’/0’字符转换成换行符(而“%s”控制的printf()则没有将字符串末尾的’/0’转换成换行符的功能,必须增加“/n”来实现换行)。它的一般格式为 puts(字符型数组名);
这两个函数都要求数组名作参数,不能在数组名前加“&”。它们定义在标题文件stdio.h中,使用前要用
#include
把它们包含进来。
例5.3 一维字符数组的输入和输出。
#include <stdio.h>
main()
{ char city[20];
printf("请输入城市名称:");
gets(city);
puts(city);
}
程序运行情况如下:
请输入城市名称:Tianjin↓
Tianjin
例5.4 二维字符数组的输入和输出。
#include <stdio.h>
main()
{ int i;
char country[3][8];
printf("请输入国家名称:");
for(i=0;i<3;i++)
gets(country[i]);
for(i=0;i<3;i++)
puts(country[i]);
}
程序中用到“country[i]”这样的符号,它代表数组country第i行的首地址,这个问题将在第6章详细介绍。程序运行情况如下:
请输入国家名称:china↓
America↓
Japan↓
china
America
Japan
其中,前三行是输入的数据,后三行是输出的结果。
5.3.3 字符串处理函数
C语言本身不提供字符串处理的能力,但是,C编译系统提供了大量的字符串处理库函数,它们定义在标题文件string.h中,使用时只要包含这个标题文件,就可以使用其中的字符串处理函数。本节介绍最常用的几种。
1. 求字符串长度函数strlen()
该函数用来计算字符串的长度,即所给字符串中包含的字符个数(不计字符串末尾的’/0’字符),其调用格式为
strlen(字符串);
其中的参数可以是字符型数组名或字符串常数。
例5.5 字符串长度的输出。
#include <stdio.h>
main()
{ char s[]="good morning";
printf("%d",strlen(s));
}
程序运行后,输出的值是12。又如语句
printf("%d",strlen("Turbo C");
输出的值是7。
2. 字符串拷贝函数strcpy()
该函数用来将一个字符串拷贝到另一个字符串中,它的调用格式为
strcpy(字符串1,字符串2);
它可以将字符串2中的字符串复制到字符串1中。其中字符串1必须是字符型数组名,字符串2可以是字符型数组名或字符串常数。如
char string1[20],string2[20];
strcpy(string1,"FORTRAN");
表示将字符串常数"FORTRAN"复制到string1中,实现了赋值的效果。而
strcpy(string2,string1);
则表示将string1中的字符全部复制到string2中。这时,要求string2的大小能容纳string1中的全部字符。
3. 字符串比较函数strcmp()
该函数用来对两个字符串进行比较,看第一个字符串是大于、等于还是小于第二个字符串,它的调用格式为
strcmp(字符串1,字符串2);
其中字符串1和字符串2可以是字符型数组名或字符串常数,其作用是对字符串1和字符串2从左至右逐个字符进行比较(按其ASCII代码值比较),直到出现不同的字符或遇到'/0'为止。如果全部字符均相同,则认为二字符串相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。比较后的结果作为函数值返回:
若字符串1=字符串2,则函数返回0值;
若字符串1>字符串2,则函数返回一正整数,其值为二字符ASCII代码值的差;
若字符串1<字符串2,则函数返回一负整数,其值为二字符ASCII代码值的差。
例如,
strcmp("China","France");
返回的结果是-3,因为第一个字符就不相等,字母C的ASCII代码值比F小3。
例5.6 字符串比较。
#include <string.h>
main()
{ char str1[]="Book",str2[]="Book1";
if(strcmp(str1,str2)==0)
printf("%s=%s",str1,str2);
else if (strcmp(str1,str2)>0)
printf("%s>%s",str1,str2);
else
printf("%s<%s",str1,str2);
}