C语言,在C++环境下运行“输入3个字符串,按由小到大的顺序输出”用指针的方法,请高手指点~~

这是我编写的,没有用指针的方法
#include "stdio.h"
#include "string.h"
void main()
{
char s1[50],s2[50],s3[50];
char s[50];
printf("输入三个字符串:\n");
gets(s1);
gets(s2);
gets(s3);
if(strcmp(s1,s2)>0)
{
strcpy(s,s1);
strcpy(s1,s2);
strcpy(s2,s);
}
if(strcmp(s1,s3)>0)
{
strcpy(s,s1);
strcpy(s1,s3);
strcpy(s3,s);
}
if(strcmp(s2,s3)>0)
{
strcpy(s,s2);
strcpy(s2,s3);
strcpy(s3,s);
}
printf("按由小到大的顺序输出为:\n");
printf("%s\n%s\n%s\n",s1,s2,s3);
}
请指教~~~
还有请说明一下,输入字符串时,是以回车为分隔符的,还是以空格,还是要输入“\0”
我编的这个程序有问题,得不到正确的结果....请指教~~

其实stcpy(),strcmp()都是指针实现的函数,这里我定义出strcpy(),strcmp()函数,你看他们的指针实现。
#include "stdio.h"

int strcmp(char *s1,char *s2)
{
int i=0,j=0;
while(*(s1+i)!='\0'&&*(s2+j)!='\0')
{
if(*(s1+i)>*(s2+i))
return 1;
if(*(s1+i)<*(s2+i))
return -1;
i++,j++;
}
if(*(s1+i)=='\0')
{
if(*(s2+j)=='\0')
return 0;
else
return -1;
}
return 1;
}
void strcpy(char *s1, char *s2)
{
int i=0;
while(*(s2+i)!='\0')
{
*(s1+i)=*(s2+i);
i++;
}
*(s1+i)='\0';
}
void main()
{
char s1[50],s2[50],s3[50];
char s[50];
printf("输入三个字符串:\n");
gets(s1);
gets(s2);
gets(s3);
if(strcmp(s1,s2)>0)
{
strcpy(s,s1);
strcpy(s1,s2);
strcpy(s2,s);
}
if(strcmp(s1,s3)>0)
{
strcpy(s,s1);
strcpy(s1,s3);
strcpy(s3,s);
}
if(strcmp(s2,s3)>0)
{
strcpy(s,s2);
strcpy(s2,s3);
strcpy(s3,s);
}
printf("按由小到大的顺序输出为:\n");
printf("%s\n%s\n%s\n",s1,s2,s3);
}
注意我把string.h去掉了,所以这里的strcpy,
strcmp都是我自己写的,而不是库函数了。
输入字符串的时候,是以空白字符为结束输入的。回车,空格都可以。不用特意输入‘\0';
另外楼主的程序可以实现,我测试过了。
字符串大小比较是说按字典排序的,而不是长度哦,估计你应该知道。
例如:
nihao
ni
hao
排序后
hao
ni
nihao
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-12-22
你的程序排序结果是对的呀!怎么不对了?

你是不是对字符串比大小不太了解啊?

“ABC">"ABBOIJUOIUJ”,因为C>B,所以第二个字符串第二个B后面就算有几亿个字符,也比第一个字符小。

字符串比大小是逐个字符比较的。小写>大写,如a>A;从A到Z一次增大。

例如:abc,abbc,aabzzzzzz比大小,
1步.先比较第一个字符,大家都是a,不能比较出来,就看下一个字符,
2步.aabzzzzzz的第二个字符是a,其他的第二个字符都是b,那后面就不比了,aabzzzzzz就是最小了,哪怕它再长,也是最小;
3步.还剩abc和abbc比大小,同理,abc第三个字符是c,比abbc的第三个字符b大,所以abc>abbc

最后结果是:aabzzzzzz<abbc<abc

这是字符串比大小的过程。我不知道你理解的字符串比大小是怎么比的。

如果你觉得结果是aabzzzzzz>abbc>abc,那就从长度上做文章吧!

默认的比大小规则是我说的那种。不知对你有帮助没。你的程序是对的!
第2个回答  2009-12-22
这题无非就是要你实现一个strcmp的函数
这是内核里的
int strcmp(const char *cs, const char *ct)
{
unsigned char c1, c2;

while (1) {
c1 = *cs++;
c2 = *ct++;
if (c1 != c2)
return c1 < c2 ? -1 : 1;
if (!c1)
break;
}
return 0;
}
第3个回答  2009-12-22
首先你用指针的目的是什么?是想不浪费空间吗?如果不是的话
只要改成
char *s1,*s2,*3,*s;
s = (char*)malloc(sizeof(char)*50);
s1 = (char*)malloc(sizeof(char)*50);
s2 = (char*)malloc(sizeof(char)*50);
s3 = (char*)malloc(sizeof(char)*50);
其他操作一样
最后加上free(s);free(s1);free(s2);free(s3);
我按照我自己风格编了一下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
char *str[4];
int i = 0;
for(i = 0; i < 4; i++)
{
str[i] = (char *)malloc(sizeof(char) * 50);
}
printf("输入三个字符串:\n");
gets(str[0]);
gets(str[1]);
gets(str[2]);

if(strlen(str[0])>strlen(str[1]))
{
strcpy(str[4],str[0]);
strcpy(str[0],str[1]);
strcpy(str[1],str[4]);
}
if(strlen(str[0])>strlen(str[2]))
{
strcpy(str[4],str[0]);
strcpy(str[0],str[2]);
strcpy(str[2],str[4]);
}
if(strlen(str[1])>strlen(str[2]))
{
strcpy(str[4],str[1]);
strcpy(str[1],str[2]);
strcpy(str[2],str[4]);
}

printf("按由小到大的顺序输出为:\n");
printf("%s\n%s\n%s\n",str[0],str[1],str[2]);

for(i = 0; i < 4; i++)
free(str[i]);
}
相似回答