7-1 字符串排序
输入n个字符串(n<=10,每个字符串长度均小于20),按照从小到大的顺序输出这些字符串。
输入格式:
第一行输入一个整数n;接下来的n行输入n个字符串。
输出格式:
输出n个字符串,每行1个串。
输入样例:
在这里给出一组输入。例如:
5
China
Mongolia
Korea
Japan
Philippines
输出样例:
在这里给出相应的输出。例如:
China
Japan
Korea
Mongolia
Philippines
个人思路:
题目要求输入n个字符串,首先我们需要输入一个n的值 ,但是如何输入n的字符串呢?
输入一个字符串可以写成char s[]这里表示输一个字符串,s[]在这里确实就是一个指针,s[]就是一个指向字符串s的首个数组的地址,那如果是n个字符串就可以写成:s[n][20]这样来表示,后面写20是因为题目说明了字符串不会超过20.
#include<stdio.h>
int main()
{
int n;
scanf("%d\n",&n);
char s[n][20];
}
然后在输入每一个字符串下面是错误示范:
#include<stdio.h>
int main()
{
int n;
scanf("%d\n",&n);
char s[n][20];
for(int i=0;i<n;i++)
{
gets(s[i][20]);
}
}
在C语言中,二维字符数组s[n][20]
表示一个包含n个字符串的数组,每个字符串的最大长度为20。当我们使用s[i]
时,它表示第i个字符串,而s[i]
本身就是一个指向该字符串的指针。
因此,在gets(s[i]);
语句中,我们应该使用s[i]
,而不是s[i][20]
。因为s[i]
本身就是一个指向字符串的指针,gets;
会将输入的字符串存储到s[i]
指向的位置。
所以,gets
语句应该是gets(s[i]);
而不是gets(s[i][20]);
#include<stdio.h>
#include<string.h>
int main()
{
int n;
scanf("%d\n",&n);
char s[n][20];
for(int i=0;i<n;i++)
{
gets(s[i]);
}
成功存取全部字符串以后就可以用数组来比较他们之间的大小了,字符串之间的比较这里直接用c语言里的一个库函数strcmp,这里需要引入头文件:string.h
strcmp(s1, s2); 如果s1=s2那么就返回0,如果s1大返回1,s2大就返回-1。
下面我采用的是冒泡排序
完整代码:
#include<stdio.h>
#include<string.h>
int main()
{
int n;
scanf("%d\n",&n);
char s[n][20];
for(int i=0;i<n;i++)
{
gets(s[i]);
}
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{
if(strcmp(s[j],s[j+1])>0)
{
char t[20];
strcpy(t,s[j]);
strcpy(s[j],s[j+1]);
strcpy(s[j+1],t);
}
}
}
for(int i=0;i<n;i++)
{
printf("%s\n",s[i]);
}
}