本题要求编写程序,读入5个字符串,按由小到大的顺序输出。

输入格式:

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

输出格式:

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

After sorted:
每行一个字符串

输入样例:

red yellow blue green white

输出样例:

After sorted:
blue
green
red
white
yellow

方法一:二维数组

#include <stdio.h>
#include <string.h>
#define L 80
#define N 5

int main()
{
    int i,j,index;
    char letter[N][L] = {'0'};
    char temp[L];
    char ch;
    //scanf("%s %s %s %s %s",letter[0],letter[1],letter[2],letter[3],letter[4]);  
    for(i=0;i<N;i++)
    {
        ch = getchar();
        for(j=0;ch!=' ';j++)
        {
            letter[i][j] = ch;
            ch = getchar();
            if(ch == '\n')
                break;
        }
    }
    for(i=0;i<N-1;i++)
    {
        index = i;
        for(j=i+1;j<N;j++)
        {
            if(strcmp(letter[j],letter[index])<0)
                index = j;
        }
        strcpy(temp,letter[i]);
        strcpy(letter[i],letter[index]);
        strcpy(letter[index],temp);
    }
    printf("After sorted:\n");
    for(i=0;i<N;i++)
    {
        printf("%s\n",letter[i]);
    }
    return 0;
}

方法二:结构体

#include <stdio.h>
#include <string.h>
#define L 80
#define N 5
typedef struct letter{
    char let[L];
}LET;

int main(int argc, char const *argv[])
{
    int i,j,index;
    char ch;
    LET str[N];
    LET temp;
    for(i=0;i<N;i++)
    {
        memset(str[i].let,0,sizeof(char)*L);
    }
    //scanf("%s %s %s %s %s",str[0].let,str[1].let,str[2].let,str[3].let,str[4].let);  
    for(i=0;i<N;i++)
    {
        ch = getchar();
        for(j=0;ch!=' ';j++)
        {
            str[i].let[j] = ch;
            ch = getchar();
            if(ch=='\n')
                break;
        }
    }
    for(i=0;i<N-1;i++)
    {
        index = i;
        for(j=i+1;j<N;j++)
        {
            if(strcmp(str[j].let,str[index].let)<0)
                index = j;
        }
        temp = str[i];
        str[i] = str[index];
        str[index] = temp;
    }
    printf("After sorted:\n");
    for(i=0;i<N;i++)
    {
        printf("%s\n",str[i].let);
    }
    return 0;
}

总结

1、两种方法底层上逻辑(内存空间存储)是一样的。

2、两种方法赋值方式不同。strcpy函数只会拷贝有效字符,而结构体赋值则是拷贝整个内存。

3、在一行输入获取多个字符串思路:一个字符一个字符获取,当遇到两个字符串的分隔符时,结束一轮字符串获取。需要两个循环嵌套,外层循环负责字符串的个数,内存循环负责单个字符串中字符的个数。

4、对字符串进行初始化。可以用memset函数进行初始化。

5、字符串大小比较:不知道为什么,我一开始写的是strcmp(str[j].let,str[index].let)==-1,自己编译能正常出结果,但是在PAT网站上测试结果为“sample等价-->答案错误”、“字符串长度取最大和最小-->答案错误”,改成strcmp(str[j].let,str[index].let)<0就能通过测试。strcmp(char dest,char src)函数是对字符串中的字符依次进行比较(ASCII码)直到不相等或比完为止,返回3个值,0表示字符串dest和src相等,1表示字符串dest大于src,-1表示字符串dest小于src。

Last modification:2021 年 03 月 27 日 16 : 47 : 07