梦幻西游枪造型大全:这段代码哪里错了?(C语言的简单函数调用)

来源:百度文库 编辑:中科新闻网 时间:2024/04/29 07:44:12
我这段代码的目的是:从main()函数输入5个字符串,然后通过fun1()函数将这几个字符串里面最长的那个挑出来,再用fun2()函数将这个被挑出的字符串printf出来。
#include "string.h"
fun2(char a[])
{
printf("%s\n",a);
}
fun1(char a[5][20])
{
int i;
for(i=0;i<4;i++)
if(strlen(a[i])<strlen(a[i+1]))
strcpy(a[i],a[i+1]);
fun2(a[i]);
}
main()
{
char str[5][20];
int i;
for(i=0;i<5;i++)
scanf("%s",str[i]);
fun1(str);
}

fun1的函数功能与你描述的不一样。
fun1(char a[5][20])
{
int i;
for(i=0;i<4;i++)
if(strlen(a[i])<strlen(a[i+1]))
strcpy(a[i],a[i+1]);
fun2(a[i]);
}
最后你执行fun2(a[i]),永远都是输出a[4]中的字符串。
而且
if(strlen(a[i])<strlen(a[i+1]))
strcpy(a[i],a[i+1]);
只是简单地将短的字符串覆盖,并不保证a[4]是最长的,因为a[4]永远不会被改变(strcpy最多执行到strcpy(a[3],a[4]),改变的只是a[3].
建议将fun1写成如下:
fun1(char a[5][20])
{
int i;
char buf[20];
strcpy(buf,a[0]);
for(i=1;i<5;i++)
{
if (strlen(buf)<strlen(a[i])
strcpy(buf,a[i]);
}
fun2(buf);
} //这样就不会修改原来已经输入的字符串

如果按你那样写,也可以将a[0]作为存储最大长度字符串的缓冲区。
fun1(char a[5][20])
{
int i;
for(i=1;i<5;i++)
if(strlen(a[0])<strlen(a[i]))
strcpy(a[0],a[i]);
fun2(a[0]);
}
p.s:这样传递参数不是一种好的方式,而且传参的时候char[5][20]和char[][20]是等价的,那个5根本不起作用,最好另外加个int参数代表字符串的个数。

#include "string.h"
#include "stdio.h"
void fun2(char a[])
{
printf("%s\n",a);
}
void fun1(char a[5][20])
{
int i;
char temp[20];
for(i=0;i<4;i++)
if(strlen(a[i])<strlen(a[i+1]))
{
strcpy(temp,a[i]);
strcpy(a[i],a[i+1]);
strcpy(a[i+1],temp);
}
fun2(a[i]);
}
void main()
{
char str[5][20];
int i;
for(i=0;i<5;i++)
scanf("%s",str[i]);
fun1(str);
}

最好使用指针处理.

没有#include <stdio.h>
直接调用printf(),没有报错么?~

for(i=0;i<4;i++) 改为 for(i=3;i>=0;i--)
fun2(a[i]) 改为 fun2(a)