本题要求编写程序,读入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。
本文链接:https://shengto.top/c/pat_47.html
转载时须注明出处及本声明