习题8-7 字符串排序

习题8-7 字符串排序

输入格式:

输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。

输出格式:

按照以下格式输出排序后的结果:

After sorted:
每行一个字符串

输入样例:

red yellow blue black white

输出样例:

After sorted:
black
blue
red
white
yellow

 第一次代码如下:

#include <stdio.h>
#include <string.h>
void getstr(char a[]);
void Myswap(char **p1,char **p2);
int main(){
	int i,j;
	char a[81]={0},b[81]={0},c[81]={0},d[81]={0},e[81]={0};
	char *ptr[]={a,b,c,d,e};
	for(i=0;i<5;i++){
		getstr(ptr[i]);
	}
	for(i=1;i<5;i++){
		for(j=1;j<5-i+1;j++){
			if(strcmp(ptr[j-1],ptr[j])>0){
				Myswap(ptr[j-1],ptr[j]);
			}
		}
	}
    printf("After sorted:");
	for(i=0;i<5;i++){
		printf("\n%s",ptr[i]);
	}
}
void getstr(char a[]){
	char ch;
	int i=0;
	while((ch=getchar())!=' '&&ch!='\n'){
		a[i]=ch;
		i++;
	}
}
void Myswap(char **a, char **b){
	char *temp = *a;
    *a = *b;
    *b = temp;
}

但提交之后

手动输入测试数据之后

 

果然有问题,不知道为什么大于8个元素后的都被吞掉了 ,对代码进行检查,发现是在交换的位置忘加取地址符,这次的教训就是不能忽略警告

答案如下:

#include <stdio.h>
#include <string.h>
void getstr(char a[]);
void Myswap(char **p1,char **p2);
int main(){
	int i,j;
	char a[81]={0},b[81]={0},c[81]={0},d[81]={0},e[81]={0};
	char *ptr[]={a,b,c,d,e};
	for(i=0;i<5;i++){
		getstr(ptr[i]);
	}
	for(i=1;i<5;i++){//冒泡法排序
		for(j=1;j<5-i+1;j++){
			if(strcmp(ptr[j-1],ptr[j])>0){
				Myswap(&ptr[j-1],&ptr[j]);
			}
		}
	}
    printf("After sorted:");
	for(i=0;i<5;i++){
		printf("\n%s",ptr[i]);
	}
}
void getstr(char a[]){/ 定义一个函数,用于获取字符串
	char ch;
	int i=0;
	while((ch=getchar())!=' '&&ch!='\n'){//循环,直到遇到空格或回车
		a[i]=ch;
		i++;
	}
}
void Myswap(char **a, char **b){// 定义一个函数,用于交换两个字符串的地址
	char *temp = *a;
    *a = *b;
    *b = temp;
}

 提交后:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值