问题 填空题

给定程序MODI1.C中函数fun的功能是:从N个字符串中找出最长的那个串,并将其地址作为函数值返回。各字符串在主函数中输入,并放入一个字符串数组中。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
文件MODI1.C内容如下:
#include<stdio.h>
#include<string.h>
#define N 5
#define M 81
/**********found**********/
fun(char(*sq)[M])

int i;
char *sp;
sp=sq[0];
for(i=0;i<N;i++)
if(strlen(sp)<strlen(sq[i]))sp=sq[i];
/**********found**********/
return sq;

void main( )
char str[N][M],*longest;
int i;
printf("Enter%d lines: \n",N);
for(i=0;i<N;i++)gets(str[i]);
printf("\nThe N string: \n",N);
for(i=0;i<N;i++)puts(sir[i]);
longest=fun(str);
printf("\nThe longest string: \n");
puts(longest);

答案

参考答案:第1处:将“fun(char (*sq)[M])”改为“char *fun(char (*sq)[M])”。
第2处:将“return sq;”改为“return sp;”。

解析: 主函数中对函数fun的调用语句是“longest=fun(str);”,其中longest是一个字符型指针,实参str是一个二维数组,通过对函数fun调用语句的分析可以发现,函数fun是有返回值的,而且返回的是一个字符型的指针,函数fun的形参只有一个,是一个指向包含M个元素的一维数组的指针。对于第1处错误,函数定义时省略了类型,则默认为int型。根据上述分析可知,函数类型定义出错,应该定义为“char *”,说明函数的返回值是一个字符型数据的地址。函数fun中通过循环比较,求出最长的字符串的地址,并将该地址存放在了指针变量sp中,所以函数的返回值出现错误,应该返回sp,而不是sq。
[归纳总结] 函数的定义和返回值出错是程序修改题中的常见错误。若“/*******found********/”标注在函数定义上,则说明函数的定义有问题,应该仔细分析以下3个方面:
(1)函数类型定义是否出错。函数类型定义是否有错误,可以通过两个地方做出准确的判断:一是观察函数是否有return语句。若有,则通过语句中返回值的类型来判断函数的类型;若没有return语句,则函数类型通常定义为void。二是观察main函数中对函数:fun的调用方式。若用单独的一条语句来调用,则通常将函数定义为void类型;若函数调用作为表达式出现,则说明函数有返回值,返回值的类型可帮助判定函数fun的类型。
(2)函数名是否有错。这个错误要通过main函数中对函数的调用来判断。因为改错题中main函数是正确程序,所以main函数中函数调用语句的函数名称是什么,那么函数定义时也必须用这个函数名。
(3)形参是否有错。该错误通常表现在形参的类型和形参的个数上。这个错误必须根据main函数中实参的类型和个数来进行判断。
若“/*******found********/”标注在return语句上,则说明该语句有错误,即函数的返回值有问题。必须仔细阅读题目说明,分析清楚究竟哪个表达式或变量的值应该作为函数值返回。

单项选择题
单项选择题