【哦,我的字符串大人】字符串数组的排序输入输出

像个自不量力的复读生,完不成金榜题名的使命。 这比喻可以啊

今天小李的c语言复习到字符串了!小李一开始是段错误(开多大都溢出),那么问题出在哪里了呢。真相只有一个!

原题描述:

学习了字典序和字符串比较之后,今天让我们来给学生名单进行一下排序。我们知道计算理工学院的每个精英班有 10 名学生,老师会依次给出 10 名学生的名字(均为不含有空格的英文字符串)。你需要将这些名字按照字典序从小到大进行输出。

输入格式

测评机会反复运行你的程序。每次程序运行时,你的程序会被输入 1010 行不含有空格的字符串,分别对应十个学生的姓名(字符串长度均大于 0且小于 20)。

输出格式

输出为 10 行,为排序后的 10 个学生姓名,每个学生姓名单独占一行。

样例输入

Alice
Bob
Gary
Harry
Ivn
Julia
Danis
Fone
Candy
Evan

样例输出

Alice
Bob
Candy
Danis
Evan
Fone
Gary
Harry
Ivn
Julia

解题思路:

其实和数字数组排序差不多,就是一一比较找所寻区间最小值并且逐步缩小区间。

#include <stdio.h>
#include <string.h>
char name[10][21],temp[21];
void s_sort(){
	for(int i=1;i<=10;i++){
		for(int j=i+1;j<=10;j++){
			if(strcmp(name[i],name[j])>0){
				strcpy(temp,name[i]);
				strcpy(name[i],name[j]);
				strcpy(name[j],temp);
			}
		}
	}
}
int main(){
	for(int i=1;i<=10;i++)scanf("%s",&name[i]);
//	for(int i=1;i<=10;i++)printf("%s\n",name[i]);
	s_sort();
	for(int i=1;i<=10;i++)printf("%s\n",name[i]);
	return 0;
}

至于前面的段错误,是我少写了一层循环,并且还让相邻比较。当然会超咯。

 

数组和字符串常见的问题:段错误!

下面是输出最长名字的一个题,也考的字符串。

一个班级中有 n 个学生,每个学生有一个名字。班主任希望知道学生中名字最长(名字中的一个空格长度计为 1)的学生是谁。

提示 1:带有空格的输入,可以使用 scanf 读入时可以逐字符读入,第一个参数使用 "%c",每行读入以 \n 字符被读入来判断结束。对于是否还有新的行没有读入的情况,可以用:

while (scanf(/* 这部分省略*/) != EOF) {

}的方式进行。

提示 2:由于 scanf 之后使用 "%c" 格式,读入 n 之后的 \n 一定要在之前进行处理。初始化代码中已经给出。

输入格式

你的程序接受的输入的第一行是一个整数 n,表示学生的总数。之后的 n 行,每行会接受一个学生的名字(可能有空格)。学生的名字不超过 100 个字符。

输出格式

输出 n 位学生中最长的学生名字(如果有多个名字一样长的学生,输出第一个)。

习题目的

  • 练习对字符的操作和使用
  • 练习使用循环
  • 练习 strlen 函数使用
  • 鼓励使用 strcpy 函数
  • 练习使用 EOF 表示读到文件末尾

样例输入

3
Steve Jobs
Bill Ma
Sunny Fei

样例输出

Steve Jobs

这个题的重点是怎样读入名字。

#include <stdio.h>
#include <string.h>
int main() {
    int n,j;
    char m;
    scanf("%d", &n);
    char max[100] = " ";
    for (int i = 0; i < n; i++) {
        char name[100] = " ";
        while (scanf("%c", &m) != EOF) {
            if (m!='\n')name[j++] = m ;
            else{
                j = 0;
                if (strlen(name) > strlen(max))
                   strcpy(max,name);
                break;
            } 
        }
    }
    printf("%s\n",max);
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我们来一步步实现单词重新排序的功能。 首先,我们需要从用户输入获取一个字符串。我们可以使用 `Scanner` 类从控制台读取用户输入。代码如下: ```java import java.util.Scanner; public class WordSort { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入一个字符串:"); String str = input.nextLine(); input.close(); // 接下来的代码将在这里编写 } } ``` 接着,我们需要将字符串转换为单词数组。我们可以使用 `split` 方法将字符串按照空格分割成单词,然后存储到一个字符串数组中。代码如下: ```java String[] words = str.split(" "); ``` 接下来,我们需要对单词进行排序。我们可以使用冒泡排序算法,按照字典序对单词进行排序排序完成后,我们可以将排序后的单词重新组合成一个字符串。代码如下: ```java for (int i = 0; i < words.length - 1; i++) { for (int j = 0; j < words.length - i - 1; j++) { if (words[j].compareTo(words[j + 1]) > 0) { String temp = words[j]; words[j] = words[j + 1]; words[j + 1] = temp; } } } String sortedStr = String.join(" ", words); System.out.println("重新排序后的字符串为:" + sortedStr); ``` 完整代码如下: ```java import java.util.Scanner; public class WordSort { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入一个字符串:"); String str = input.nextLine(); input.close(); String[] words = str.split(" "); for (int i = 0; i < words.length - 1; i++) { for (int j = 0; j < words.length - i - 1; j++) { if (words[j].compareTo(words[j + 1]) > 0) { String temp = words[j]; words[j] = words[j + 1]; words[j + 1] = temp; } } } String sortedStr = String.join(" ", words); System.out.println("重新排序后的字符串为:" + sortedStr); } } ``` 现在,我们可以编译并运行程序进行测试了。例如,我们输入以下字符串: ``` hello world java ``` 程序将输出以下结果: ``` 重新排序后的字符串为:hello java world ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值