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);
          }