全国计算机二级C语言程序设计真题


(考试时间120分钟,满分100分)
一、选择题(每小题1分,共40分)
(1)程序流程图中带有箭头的线段表示的是(                )。
A)图元关系                B)数据流                C)控制流                D)调用关系
C【解析】在数据流图中,用标有名字的箭头表示数据流。在程序流程图中,用标有名字的箭头表示控制流。所以选择C。
 
(2)结构化程序设计的基本原则不包括(                )。
A)多态性                B)自顶向下                C)模块化                D)逐步求精
A【解析】结构化程序设计的思想包括:自顶向下、逐步求精、模块化、限制使用goto语句,所以选择A。
 
(3)软件设计中模块划分应遵循的准则是(                )。
A)低内聚低耦合        B)高内聚低耦合        C)低内聚高耦合        D)高内聚高耦合
B【解析】软件设计中模块划分应遵循的准则是高内聚低偶合、模块大小规模适当、模块的依赖关系适当等。模块的划分应遵循一定的要求,以保证模块划分合理,并进一步保证以此为依据开发出的软件系统可靠性强,易于理解和维护。模块之间的耦合应尽可能的低,模块的内聚度应尽可能的高。
 
(4)在软件开发中,需求分析阶段产生的主要文档是(                )。
A)可行性分析报告                B)软件需求规格说明书
C)概要设计说明书                D)集成测试计划
B【解析】A错误,可行性分析阶段产生可行性分析报告。C错误,概要设计说明书是总体设计阶段产生的文档。D错误,集成测试计划是在概要设计阶段编写的文档。B正确,需求规格说明书是后续工作如设计、编码等需要的重要参考文档。
 
(5)算法的有穷性是指(                )。
A)算法程序的运行时间是有限的                B)算法程序所处理的数据量是有限的
C)算法程序的长度是有限的                        D)算法只能被有限的用户使用
A【解析】算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。有穷性是指算法程序的运行时间是有限的。
 
(6)对长度为n的线性表排序,在最坏情况下,比较次数不是n(n-1)/2的排序方法是(  )。
A)快速排序                B)冒泡排序        C)直接插入排序                D)堆排序
D【解析】除了堆排序算法的比较次数是O(nlog2n),其他的都是n(n-1)/2。
 
(7)下列关于栈的叙述正确的是(                )。
A)栈按“先进先出”组织数据                B)栈按“先进后出”组织数据
C)只能在栈底插入数据                                D)不能删除数据
【解析】栈是按“先进后出”的原则组织数据的,数据的插入和删除都在栈顶进行操作。

 

(8)在数据库设计中,将E-R图转换成关系数据模型的过程属于(        )。
A)需求分析阶段        B)概念设计阶段        C)逻辑设计阶段        D)物理设计阶段
C【解析】E-R图转换成关系模型数据则是把图形分析出来的联系反映到数据库中,即设计出表,所以属于逻辑设计阶段。

 

(9)有三个关系R、S和T如下:
120538szne4kl4l700z6n9-1
由关系R和S通过运算得到关系T,则所使用的运算为(  )。
A) 并                B)自然连接                C)笛卡尔积                D)交
D【解析】自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以B错误。笛卡尔积是用R集合中元素为第一元素,S集合中元素为第二元素构成的有序对,所以C错误。根据关系T可以很明显地看出是从关系R与关系S中取得相同的关系组所以取得是交运算,选择D。

 

(10)设有表示学生选课的三张表,学生S(学号,姓名,性别,年龄,身份证号),课程C(课号,课名),选课SC(学号,课号,成绩),则表SC的关键字(键或码)为()。
A)课号,成绩                B)学号,成绩                C)学号,课号                D)学号,姓名,成绩
C【解析】学号是学生表S的主键,课号是课程表C的主键,所以选课表SC的关键字就应该是与前两个表能够直接联系且能唯一定义的学号和课号,所以选择C。
 
(11)以下叙述中错误的是(   )。
A)C语言中的每条可执行语句和非执行语句最终都将被转换成二进制的机器指令
B)C程序经过编译、连接步骤之后才能形成一个真正可执行的二进制机器指令文件
C)用C语言编写的程序称为源程序,它以ASCII代码形式存放在一个文本文件中
D)C语言源程序经编译后生成后缀为.obj的目标程序
A【解析】C语言中的非执行语句不会被编译,不会生成二进制的机器指令,所以A错误。由C语言构成的指令序列称C源程序,C源程序经过C语言编译程序编译之后生成一个后缀为.OBJ的二进制文件(称为目标文件);最后要由“连接程序”把此.OBJ文件与C语言提供的各种库函数连接起来生成一个后缀为.EXE的可执行文件。
 
(12)以下选项中,合法的一组C语言数值常量是(        )。
A)    12.0Xa234.5e0                B)    028.5e-3-0xf     
C)    .1774e1.50abc             D)    0x8A10,0003.e5
A【解析】C语言中八进制整型常量的开头是数字0,十六进制整型常量的数字开头是0x。C语言中的实型常量有两种表示形式:小数形式,小数形式表示的实型常量必须要有小数点;指数形式,以“e”或“E”后跟一个整数来表示以10为底数的幂数,且规定字母e或E之前必须要有数字,且e或E后面的指数必须为整数。B选项中 028错误,八进制中没有数字8。C选项中4e1.5中e后面的指数不是整数。D选项中3.e5小数点后面缺少数字。

 

(13)以下选项中不合法的标识符是(        )。
A)&a                B)FOR                C)print                D)_00
A【解析】C语言中标识符由字母、下划线、数字组成,且开头必须是字母或下划线。另外,关键字不能作为标识符。因为C语言中区分大小写,所以B选项中的“FOR”可以作为标识符来用。A选项中含有非法字符&,所以选择A。
 
(14)若有代数式|nx+ex|(其中e仅代表自然对数的底数,不是变量),则以下能够正确表示该代数式的C语言表达式是( )。
A)sqrt(fabs(pow(n,x)+exp(x)))                B)sqrt(fabs(pow(n,x)+pow(x,e)))
C)sqrt(abs(n^x+e^x))                                D)sqrt(fabs(pow(x,n)+exp(x)))
A【解析】B选项中函数pow(x,e)错误应该直接使用exp(x)函数。C选项中函数abs(n^x+e^x)错误,应该使用fabs()返回浮点数的绝对值。D选项中pow(x,n)参数顺序错误。
 
(15)若有定义:double a=22;int i=0,k=18;,则不符合C语言规定的赋值语句是(  )。
A)i=(a+k)<=(i+k);                B)i=a%11;        C)a=a++,i++;                        D)i=!a;
B【解析】取模运算符“%”,二元运算符,具有左结合性,参与运算的量均为整型。选项B中的a变量是double实型,所以B不符合规定。
 
(16)有以下程序:
#include  <stdio.h>
main()
{ int s,t,A=10; double B=6;
s=sizeof(A); t=sizeof(B);
printf(“%d,%dn”,s,t);
}
在VC 6.0平台上编译运行,程序运行后的输出结果是(         )。
A)10,6                B)4,4                C)2,4                D)4,8
D【解析】C语言中利用sizeof()函数判断数据类型长度,在VC 6.0平台中,整型int占有4个字节,double型数据占有8个字节。
 
(17)有以下程序:
#include  <stdio.h>
main()
{ char  a,b,c,d;
scanf(“%c%c”,&a, &b);
c=getchar();    d=getchar();
printf(“%c%c%c%cn”,a,b,c,d);
}
当执行程序时,按下列方式输入数据(从第1列开始,<CR>代表回车,注意:回车也是一个字符)
12<CR>
34<CR>
则输出结果是()。
A)             12
34
B)      12
C)      1234
D)     12
3  
D【解析】按照从键盘输入的数据可以判断字符1给了变量a,字符2给了变量b,字符<CR>即回车给了变量c,字符3给了变量d。所以打印输出的结果为D选项。        
 
(18)以下关于逻辑运算符两侧运算对象的叙述中正确的是(        )。
A)可以是任意合法的表达式                B)只能是整数0或非0整数
C)可以是结构体类型的数据                D)只能是整数0或1
A【解析】C语言的逻辑运算符比较特别,它的操作数没有明确的数据类型,可以是任意合法的表达式,所以选择A。
 
(19)有以下程序:
#include  <stdio.h>
main()
{int  a=0,b=0,c=0,d=0;
if(a=1)  b=1;c=2;
else    d=3;
printf(“%d,%d,%d,%dn”,a,b,c,d);
}
程序运行后的输出结果是(         )。
A)1,1,2,0                B)0,0,0,3                C)编译有错                D)0,1,2,0
A【解析】C语言的逻辑运算符比较特别,它的操作数没有明确的数据类型,可以是任意合法的表达式,所以选择A。
 
(20)有以下程序:
#include  <stdio.h>
main()
{int   x=1, y=0, a=0, b=0;
switch (x)
{case   1:
switch(y)
{case   0:  a++;  break;
case   1:  b++;  break;
}
case 2:  a++;  b++;  break;
case 3:  a++;  b++;
}
printf(“a=%d, b=%dn”, a, b);
}
程序运行后的输出结果是()。
A) a=2,b=2                B)a=2,b=1                C)a=1,b=1                D)a=1,b=0
B【解析】case常量表达式只是起语句标号作用,并不是该处进行条件判断。在执行switch语句时,根据switch的表达式,找到与之匹配的case语句,就从此case子句执行下去,不在进行判断,直到碰到break或函数结束为止。所以执行内层switch(y)时只执行了a++,此时a的值为1。然后执行外层case 2语句的a++;b++;a为2,b为1。所以结果为B。
 
(21)以下程序段中的变量已正确定义:
for( i=0; i<4; i++,i++ )
for( k=1; k<3; k++ ); printf(“*” );
程序段的输出结果是()。
A)**         B)****        C)*                D)********
C【解析】由于内层循环        for( k=1; k<3; k++)后面直接跟了空语句“;”所以在循环内部什么操作也不做,跳出外层循环后执行打印语句,所以打印了一个“*”,选择C。
 
(22)有以下程序段:
#include  <stdio.h>
int  i, n;
for( i=0; i<8; i++ )
{n = rand() % 5;
switch (n)
{case 1:
case 3:  printf(“%d n”, n);  break;
case 2:
case 4:  printf(“%d n”, n);  continue;
case 0:  exit(0);
}
printf(“%d n”,n);
}
以下关于程序段执行情况的叙述,正确的是(        )。
A)for循环语句固定执行8次
B)当产生的随机数n为4时结束循环操作
C)当产生的随机数n为1和2时不做任何操作
D)当产生的随机数n为0时结束程序运行
D【解析】case常量表达式只是起语句标号作用,并不是该处进行条件判断。在执行switch语句时,根据switch的表达式,找到与之匹配的case语句,就从此case子句执行下去,不再进行判断,直到碰到break或函数结束为止。简单的说break是结束整个循环体,而continue是结束单次循环。B选项中当产生的随机数n为4时要执行打印操作。C选项中当产生的随机数为1和2时分别执行case3与case4后面语句的内容。由于存在break语句所以for循环不是固定执行8次,执行次数与产生的随机数n有关系。
 
(23)有以下程序:
#include  <stdio.h>
int f(int x);
main()
{ int n=1,m;
m=f(f(f(n))); printf(“%dn”,m);
}
int f(int x)
{ return x*2; }
程序运行后的输出结果是(        )。
A)8                B)2                C)4                D)1
A【解析】第一次调用m=f(f(f(1))),第二次为m=f(f(2)),第三次为m=f(4),即返回值为8。
 
(24)以下叙述中错误的是(        )。
A)可以给指针变量赋一个整数作为地址值
B)函数可以返回地址值
C)改变函数形参的值,不会改变对应实参的值
D)当在程序的开头包含头文件stdio.h时,可以给指针变量赋NULL
A【解析】不能将一个整数直接赋给指针变量作为地址,所以A是错误的。函数的返回值可以是地址,即指针。函数调用中形参值的变化不会传递给实参。
 
(25)设已有定义:float  x;,则以下对指针变量p进行定义且赋初值的语句中正确的是(  )。
A)int  *p=(float)x;                B)float  *p=&x;
C)float  p=&x;                D)float  *p=1024;
B【解析】        指针是用来存放地址的变量,用 (类型名 *指针变量名)的形式定义。赋值时应将某个变量地址即&x 赋给指针变量,所以选择B
 
(26)以下数组定义中错误的是(        )。
A)int  x[2][3]={1,2,3,4,5,6};
B)int  x[][3]={0};
C)int  x[][3]={{1,2,3},{4,5,6}};
D)int  x[2][3]={{1,2},{3,4},{5,6}};
D【解析】D选项中x[2][3]定义的是一个两行三列的二维数组,而在给数组元素赋值时却赋成了三行,所以错误。
 
(27)有以下程序:
#include  <stdio.h>
void fun( int  a[], int  n)
{int   i, t;
for(i=0; i<n/2; i++)  { t=a;  a=a[n-1-i];  a[n-1-i]=t; }
}
main()
{int   k[10]={ 1,2,3,4,5,6,7,8,9,10},i;
fun(k,5);
for(i=2; i<8; i++) printf(“%d”,k);
printf(“n”);
}
程序运行后的输出结果是()。
A)321678                B)876543                C)1098765                D)345678
A【解析】        本题中的函数fun()的功能是将数组k中前5个元素倒序,所以返回后数组k中的元素排列是5,4,3,2,1,6,7,8,9,10。所以打印输出k[2]到k[7]元素的值,即321678,所以选择A。
 
(28)有以下程序:
#include  <stdio.h>
#define   N    4
void  fun(int  a[][N], int  b[])
{int  i;
for (i=0; i<N; i++)   b = a – a[N-1-i];
}
main()
{int  x[N][N]={{1, 2, 3, 4}, {5, 6, 7, 8}, {9,10,11,12}, {13,14,15,16}}, y[N], i;
fun (x, y);
for (i=0; i<N; i++)   printf(“%d,”, y);    printf(“n”);
}
程序运行后的输出结果是(        )。
A)-3,-1,1,3,                B)-12,-3,0,0,                C)0,1,2,3,                D)-3,-3,-3,-3,
A【解析】        本题中由fun函数可知,b[0]=a[0][0]-a[0][3]=1-4=-3,b[1]=a[1][1]-[1][2]=6-7=-1, b[2]=a[2][2]-[2][1]=11-10=1, b[3]=a[3][3]-[3][1]=16-13=3。所以主函数中打印y数组元素的值为A选项。
 
(29)设有定义:char  s[81];  int  i=0;,以下不能将一行(不超过80个字符)带有空格的字符串正确读入的语句或语句组是(        )。
A)gets(s);
B)while((s[i++]=getchar())!=’n’);s=”;
C)scanf(“%s”,s);
D)do{ scanf(“%c”,&s); }while(s[i++]!=’n’); s=”;
C【解析】字符串的输入不能使用scanf(“%s”,s);而应该使用gets(s)。
 
(30)设有定义:char  p[]={‘1’, ‘2’, ‘3’},*q=p; ,以下不能计算出一个char型数据所占字节数的表达式是(        )。
A)sizeof(p)        B)sizeof(char)        C)sizeof(*q)        D)sizeof(p[0])
A【解析】根据题目中的定义可以知道sizeof(p),计算的是数组p中所有元素所占用的字节数,而不是char型数据所占字节数。
 
(31)有以下程序:
#include  <stdio.h>
#include  <string.h>
main()
{char str[][20]={“One*World”,”One*Dream!”},*p=str[1];
printf(“%d,”,strlen(p));  printf(“%sn”,p);
}
程序运行后的输出结果是(         )。
A)10,One*Dream!                B)9,One*Dream!                C)9,One*World                D)10,One*World
A【解析】p是指向二维字符数组第二行One*Dream!的数组指针,所以长度是10,打印输出的也是该字符串。
 
(32)有以下程序:
#include  <stdio.h>
main()
{char  s[]=”012xy8s34f4w2″;
int  i, n=0;
for ( i=0; s!=0; i++ )
if(s >= ‘0’ && s <= ‘9’)  n++;
printf(“%dn”,n);
}
程序运行后的输出结果是(                )。
A)0                B)3                 C)7                D)8
B【解析】本题中遇到“”字符循环结束,所以只统计“”之前的数字字符,所以为3。
 
(33)有以下程序:
#include  <stdio.h>
fun(int  x, int  y)
{ static int  m=0, i=2;
i+=m+1;    m=i+x+y;    return m;
}
main()
{ int  j=1, m=1, k;
k=fun(j,m);    printf(“%d,”,k);
k=fun(j,m);    printf(“%dn”,k);
}
程序执行后的输出结果是()。
A)5, 11                B)5, 5                C)11, 11                D)11, 5
A【解析】声明静态局部变量:函数调用结束后,其占用的存储单元不释放,在下次该函数调用时,该变量保留上一次函数调用结束时的值。本题子函数fun中的变量 i和m均为静态局部变量。所以第一次调用fun函数,返回m的值为5,第二次再调用fun函数时,i的值为3,m的值已经是5了,所以执行i+=m+1,i的值变为9,m=i+x+y=9+1+1=11。
 
(34)在C语言中,只有在使用时才占用内存单元的变量,其存储类型是()。
A)auto和static        B)extern和register        C)auto和register        D)static和register
C【解析】auto:函数中的局部变量,动态地分配存储空间,数据存储在动态存储区中,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。register:为了提高效率,C语言允许将局部变量的值放在CPU中的寄存器中,这种变量叫“寄存器变量”,只有局部自动变量和形式参数可以作为寄存器变量。extern:外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。static:静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。
 
(35)下面结构体的定义语句中,错误的是()。
A)struct  ord  {int  x;int  y;int  z;} struct  ord  a;
B)struct  ord  {int  x;int  y;int  z;}; struct  ord  a;
C)struct  ord  {int  x;int  y;int  z;} a;
D)struct  {int  x;int  y;int  z;}  a;
A【解析】A选项struct  ord  {int  x;int  y;int  z;} struct  ord  a;错误,不能在定义结构体的同时,又用结构体类型名定义变量。应该写成B选项或者D选项的格式。
 
(36)有以下程序:
# include   <stdio.h>
typedef struct { int  b, p; } A;
void f(A  c)   /*  注意:c是结构变量名   */
{ int  j;
c.b += 1;  c.p+=2;
}
main()
{ int  i;
A  a={1,2};
f(a);
printf(“%d,%dn”, a.b, a.p);
}
程序运行后的输出结果是()。
A)2,4                B)1,2                C)1,4                D)2,3
B【解析】结构体变量可以作为函数的参数和返回值。作为函数的实参时,可以实现函数的传值调用。当使用结构体变量作为函数的形参时,实参也应该是结构体变量名以实现传值调用,实参将拷贝副本给形参,在被调用函数中改变形参值对于调用函数中的实参没有影响。所以选择B。
 
(37)以下叙述中正确的是(        )。
A)在C语言中,预处理命令行都以“#”开头
B)预处理命令行必须位于C源程序的起始位置
C)#include <stdio.h>必须放在C程序的开头
D)C语言的预处理不能实现宏定义和条件编译的功能
A【解析】预处理命令是以“#”号开头的命令,它们不是C语言的可执行命令,这些命令应该在函数之外书写,一般在源文件的最前面书写,但不是必须在起始位置书写,所以B、C错误。C语言的预处理能够实现宏定义和条件编译等功能,所以D错误。
 
(38)有以下程序:
#include   <stdio.h>
#include   <stdlib.h>
int  fun(int   n)
{int  *p;
p = (int*)malloc(sizeof(int));
*p=n;    return  *p;
}
main()
{int   a;
a = fun(10);    printf(“%dn”,a+fun(10));
}
程序运行后的输出结果是(                )。
A)0                B)10                C)20                D)出错
C【解析】malloc(sizeof(int))的作用是开辟一个长度为sizeof(int)存储空间,并通过强制类型转换(int*)将此存储空间的地址赋给了一个整型的指针变量p。然后执行语句*p=n,使得*p的值为10,并通过return返回此值,即a的值为10。然后在主函数中输出a+fun(10)=10+10=20。
 
(39)有以下程序:
# include   <stdio.h>
main()
{unsigned  char  a=8,  c;
c = a>>3;
printf(“%dn”, c);
}
程序运行后的输出结果是(                )。
A)16                        B)1                        C)32                        D)0
B【解析】无符号整型变量a的值为8,二进制表示为00001000,右移3位后为00000001,即十进制的1,所以输出1。
 
(40)读取二进制文件的函数调用形式为:fread(buffer,size,count,fp);,其中buffer代表的是()。
A)一个内存块的字节数
B)一个整型变量,代表待读取的数据的字节数
C)一个文件指针,指向待读取的文件
D)一个内存块的首地址,代表读入数据存放的地址
D【解析】fread(void *buffer, size_t size, size_t count, FILE *stream);功能是从一个文件流中读数据,读取count个元素,每个元素size字节,如果调用成功返回count。buffer:用于接收数据的内存地址,大小至少是size*count字节;size:单个元素的大小,单位是字节;count:元素的个数,每个元素是size字节;stream:输入流。
 
二、程序填空题(共18分)
下列给定程序中,函数fun的功能是:将形参n中个位上为偶数的数取出,并按原来从高位到低位相反的顺序组成一个新数,作为函数值返回。
例如,输入一个整数27638496,函数返回值为64862。
请在程序的下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:部分源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
unsigned long fun(unsigned long n)
{unsigned long x=0; int t;
while(n)
{ t=n%10;
/**********found**********/
if(t%2==【1】)
/**********found**********/
x=【2】+t;
/**********found**********/
n=【3】;
}
return x;
}
main()
{unsigned long n=-1;
while(n>99999999||n<0)
{ printf(“Please input(0<n<100000000): “); scanf(“%ld”,&n); }
printf(“nThe result is: %ldn”,fun(n));
}
【参考答案】
(1)0                (2)10*x                (3)n/10
【考点分析】
本题考查:已知某数,如何求该数各个位数值,已知各个位数值,如何表示该数;除法运算。
【解题思路】
填空1:定义变量t用来存放某数的各个位数值,此处判断t是否为偶数,即对2求余结果是否为0。
填空2:将t作为x的个位数,原来x的各个位上升1位,即x=10*x+1。
填空3:每循环一次,通过除法运算,去掉数值最后一位。
【解题宝典】
如果知道某数n的各个位的数值,可以得到该数值n,如n的个位为a、十位为b、百位为c,那么n=c*100+b*10+a。如果知道数值n,可以采用求余和除法操作来表示其各个位,如n%10(取个位)、n/10(取十位),读者可以自己考虑一下,如果是三位数,如何提取各个位?四位数呢?
 
三、程序修改题(共18分)
下列给定程序中函数fun的功能是:将长整型数中各位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
例如,当s中的数为87653142时,t中的数为7531。
请改正程序中的错误,使它能得出正确的结果。
注意:部分源程序在文件MODI1.C中,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
void fun(long s, long *t)
{ int d;
long sl=1;
/************found************/
t = 0;
while( s > 0)
{ d = s%10;
/************found************/
if(d%2 == 0)
{*t = d * sl + *t;
sl *= 10;
}
s /= 10;
}
}
main()
{long s, t;
printf(“nPlease enter s:”); scanf(“%ld”, &s);
fun(s, &t);
printf(“The result is: %ldn”, t);
}
【参考答案】
(1)*t=0;
(2)if(d%2!=0)或if(d%2==1)
【考点分析】
本题考查:指针型变量作为函数参数;if语句条件表达式,结合奇偶数的表示方法来确定该表达式内容。
【解题思路】
(1)由函数定义可知,变量t是指针变量,所以对t进行赋初值0是不对的。因为t指向的是存放新数的变量,所以此处应给新数赋初值0,即*t=0。
(2)变量d表示数s各个位上的数,此处的if条件应为判断d是否为奇数。
 
四、程序设计题(共24分)
编写函数fun,其功能是:实现两个字符串的连接(不要使用库函数strcat),即把p2所指的字符串连接到p1所指的字符串的后面。
例如,分别输入下面两个字符串:
FirstString--
SecondString
程序运行后的输出结果是:
FirstString--SecondString
注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include <stdio.h>
void fun(char p1[], char p2[])
{
}
main()
{char s1[80], s2[40] ;void NONO();
printf(“Enter s1 and s2:n”);
scanf(“%s%s”, s1, s2);
printf(“s1=%sn”, s1);
printf(“s2=%sn”, s2);
printf(“Invoke fun(s1,s2):n”);
fun(s1, s2);
printf(“After invoking:n”);
printf(“%sn”, s1);
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
int i ;
FILE *rf, *wf ;
char s1[80], s2[40] ;
rf = fopen(“in.dat”,”r”);
wf = fopen(“out.dat”,”w”);
for(i = 0 ; i < 10 ; i++){
fscanf(rf, “%s”, s1);
fscanf(rf, “%s”, s2);
fun(s1, s2);
fprintf(wf, “%sn”, s1);
}
fclose(rf);
fclose(wf);
}
【参考答案】
void fun(char p1[], char p2[])
{
int i,j;
for(i=0;p1!=”;i++)  ;
for(j=0;p2[j]!=”;j++)          p1[i++]=p2[j];
p1=”;
}
【考点分析】
本题考查:不使用字符串函数实现字符串连接操作。通过for循环语句来完成,不要忘了最后需要加上字符串结束标识‘’。
【解题思路】
本题用两个循环完成操作,第1个循环的作用是求出第1个字符串的长度,即将i指到第1个字符串的末尾。第2个循环的作用是将第2个字符串的字符连到第1个字符串的末尾。最后在第1个字符串的结尾加上字符串结束标识‘’。