c语言,输入3个字符串,按由小到大输出!用指针。。看看我这个怎么错了

#include "stdio.h"
#include "string.h"
main()
{
void cmp(char *p1,char *p2);
char a[80];
char b[80];
char c[80];
char *p1,*p2,*p3;

printf("Enter 3 strings:");
gets(a);
gets(b);
gets(c);

p1=a;
p2=b;
p3=c;

cmp(p1,p2);
cmp(p2,p3);
cmp(p1,p3);
puts(p1);

puts(p2);

puts(p3);

getch();
}

void cmp(char *p1,char *p2)
{ char *temp;
if(strcmp(p1,p2)>0)
{ temp=p1;
p1=p2;
p2=temp; }
}
晕,都没有排序成功

你犯得貌似都是基本的语法错误:
1.函数的声明应该放在主函数main之前,而不是放在main 里面。即void cmp(char *p1,char *p2);应该写在在main()之前。
2.要想使用getch()需要包含头文件conio.h。因此要加上 #include <conio.h>
3.getch()函数是有返回值的,应该把它的赋值给一个变量。可以写:
char ch;
ch=getch();
呵呵,忘了你的算法错误了。
在调用指针作形参的时候如void cmp(char *p1,char *p2);是属于单向值传递的。
如语句cmp(p1,p2);无论在函数中如何对p1,p2修改和赋值,它们的实际值(实参)是不会有任何改变的。
以下程序是修改后编译通过并且排序成功的的,希望对你有所帮助
#include "stdio.h"
#include "string.h"
#include <conio.h>
void cmp(char *p1,char *p2);
extern char *max="\0";
extern char *min="\0";
void main()
{
char a[80];
char b[80];
char c[80];
char *p1,*p2,*p3,*tmp1,*tmp2;
char ch;

printf("Enter 3 strings:");
gets(a);
gets(b);
gets(c);

p1=a;
p2=b;
p3=c;

cmp(p1,p2);
cmp(p1,p3);
cmp(p2,p3);
if(p1!=min&&p1!=max)p2=p1;
else if(p2!=min&&p2!=max)p2=p2;
else if(p3!=min&&p3!=max)p2=p3;
p1=min;
p3=max;
puts(p1);
puts(p2);
puts(p3);
ch=getch();
}

void cmp(char *A,char *B)
{
char *temp;
if(strcmp(A,B)>0)
{
min=B;
if(strcmp(max,A)<0) max=A;
}
else
{
min=A;
if(strcmp(max,B)<0) max=B;
}

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-10-16
要想通过形参改变实参中的值是通过地址来改变的,但是有一点:形参的交换必须是交换地址所指向的变量。那么,,也就是把你的void cmp改掉
改成:
void cmp(char *p1,char *p2)
{
char *temp;
temp=(char *)malloc(sizeof(char)*80);
if(strcmp(p1,p2)>0)
{
strcpy(temp,p1);
strcpy(p1,p2);
strcpy(p2,temp);
}
}
还有一点
定义char *p 后,没有初始化它,那么它的值是一个不确定的值,虽然可以编译过通,,但是很危险,有可能是系统中的一个值!本回答被提问者采纳
第2个回答  2010-10-16
灰常典型的错误.temp不要用指针,交换了形参而已,实参没改变.
相似回答
大家正在搜