c primer plus第11章课后题第10题:将字符串用不同方式排序。

题目要求

编写一个程序,读取输入,直到读入了10个字符串或遇到EOF,由二者中最先被满足的那个终止读取过程。这个程序可以为用户提供一个有5个选项的菜单:输出初始字符串列表、按ASCII顺序输出字符串、按长度递增顺序输出字符串、按字符串中第一个单词的长度输出字符串和退出。菜单可以循环,直到用户输入退出请求。当然,程序要能真正完成菜单中的各项功能。

思路分析

多个功能的题要拆分多个模块来实现。本题主要设计了7个函数,分别为字符串输入函数、菜单打印函数、字符串输出函数、ascii排序函数、长度排序函数、按字符串中第一个单词的长度排序函数、求字符串的第一个单词的长度函数。
编写过程中主要输入模块又出了问题,我总是不记得字符串输入的内存分配,这里可以当作公式记一下,先在主函数分配内存,然后在输入模块中完成字符串输入。

代码编写

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LIM 10
int input_string(char *s[]);
void print_menu(void);
void output_string(char * s[],int k);
void ascii_order(char * s[],int k);
void length_order(char * s[],int k);
void first_order(char * s[],int k);
int first_length(char *s);

int main(int argc, const char * argv[]) {
    char *inputString[LIM];
    char choice;
    int inputLength;
    int i;
    
    for (i=0; i<LIM; i++) {
        inputString[i] = (char*) malloc(50*sizeof(char));
    }
    puts("Please input your strings:");
    inputLength = input_string(inputString);
    printf("your input length is %d\n",inputLength);
    while((choice = getchar()) != 'e'){
        print_menu();
        choice = getchar();
        switch (choice) {
            case 'a':
                output_string(inputString,inputLength);
                break;
            case 'b':
                ascii_order(inputString,inputLength);
                break;
            case 'c':
                length_order(inputString,inputLength);
                break;
            case 'd':
                first_order(inputString,inputLength);
                break;
            case 'e':
                puts("over.");
                for (i=0; i<LIM; i++) {
                    free(inputString[i]);
                }
                return 0;
            default:
                puts("sorry,i can't understand");
        }
    }
    for (i=0; i<LIM; i++) {
        free(inputString[i]);
    }
    return 0;
}

int input_string(char *s[]){
    int pt_number = 0;//输入计数
    
    while(pt_number<LIM && gets(s[pt_number]) != NULL && s[pt_number][0] != '\0'){
        //小于10、EOF、输入完毕
        //gets函数输入EOF返回NULL
        pt_number++;
    }
    return pt_number;
    
}

void print_menu(){
    puts("Now enter what you want to do:");
    puts("a. print the strings list");
    puts("b. print the strings order by ASCII");
    puts("c. print the strings order by length");
    puts("d. print the strings order by length of the first word");
    puts("e. quit");
}

void output_string(char * s[],int k){
    int i=0;
    
    for(i=0;i<k;i++){
        puts(s[i]);
    }
}
void ascii_order(char * s[],int k){
    //按ASCII顺序输出字符串
    char *temp;
    int i=0;
    int j=0;
    
    for(i=0;i<k-1;i++){
        for(j=i;j<k;j++){
            if(strcmp(s[i], s[j]) >0){
                temp = s[i];
                s[i] = s[j];
                s[j] = temp;
            }
        }
    }
    output_string(s, k);
}
void length_order(char * s[],int k){
    //按字符串长度递增顺序输出字符串
    int i=0;
    int j=0;
    char * temp;
    
    for(i=0;i<k-1;i++){
        for(j=i;j<k;j++){
            if(strlen(s[i])>strlen(s[j])){
                temp = s[i];
                s[i] = s[j];
                s[j] = temp;
            }
        }
    }
    output_string(s, k);
}
void first_order(char * s[],int k){
    //对字符串第一个单词的长度排序
    int i=0;
    int j=0;
    char * temp;
    
    for(i=0;i<k-1;i++){
        for(j=i;j<k;j++){
            if(first_length(s[i])>first_length(s[j])){
                temp=s[i];
                s[i]=s[j];
                s[j]=temp;
            }
        }
    }
    output_string(s, k);
}

int first_length(char *s){
    //找到字符串的第一个单词
    int i;
    int count=0;
    int length;
    
    length =strlen(s);
    for(i=0;i<length;i++){
        if(s[i] != ' '){
            count++;
        }else{
            break;
        }
    }
    return count;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值