输入一个字符串,将此字符串中最长的单词输出。要求至少使用一个自定义函数。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据输入一个字符串(长度不超过80)。
输出格式:
对于每组测试,输出字符串中的最长单词,若有多个长度相等的最长单词,输出最早出现的那个。这里规定,单词只能由大小写英文字母构成。
输入样例:
Keywords insert, two way insertion sort,
Abstract This paper discusses three method for two way insertion
words. insert, two way sorted.
You're a boy.
输出样例:
insertion
discusses
insert
You
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路
isLetter
函数用于判断一个字符是否是英文字母。如果是,则返回 1;否则返回 0。findLongestWord
函数查找一行字符串中最长的单词并输出。它接受一个指向字符串的指针作为参数。- 在
findLongestWord
函数中,首先初始化了三个变量:最长单词长度maxlen
、最长单词起始位置start
和最长单词结束位置end
。同时,初始化一个循环变量i
和输入字符串的长度n
。 - 然后进入外层
while
循环,它负责处理每个单词。在每次循环前,内部变量maxlen
被重置为 0 以便容纳新单词的长度。开始时,循环变量i
指向当前单词的第一个字母的位置。 while
循环内部有两个嵌套的while
循环。第一个while
循环跳过字符不是英文字母的字符,直到找到一个单词的第一个字母。如果整个字符串都被扫描完,则退出外层循环。- 找到第一个字母后,开始第二个嵌套的
while
循环。它处理当前单词中所有英文字母,直到扫描完了整个单词或者扫描到了非英文字母为止。 - 计算当前单词的长度,并与已知最长单词长度
maxlen
进行比较。如果当前单词更长,则更新最长单词长度和起始/结束位置。 - 将循环变量
i
移动到下一个单词的开头,然后返回步骤 6 (可能会直接跳过这一步而退出外层循环)。 - 最后按字符串 (start,end) 的范围输出最长单词。
- 主函数从标准输入逐行读入字符串,并调用
findLongestWord
函数查找并输出每行中最长的单词。程序在结束之前返回值 0。
代码
#include <stdio.h>
// 判断字符是否是英文字母
int isLetter(char c) {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
// 查找一行字符串中最长的单词并输出,不包括标点符号
void findLongestWord(char* str) {
int maxlen = 0, start = 0, end = 0;
int i = 0, n = strlen(str);
while (i < n) {
// 跳过单词前的非字母字符
while (i < n && !isLetter(str[i])) {
i++;
}
if (i == n)
break; // 已处理完所有单词
// 计算当前单词的长度
int j = i;
while (j < n && isLetter(str[j])) {
j++;
}
int len = j - i;
// 更新最长单词及起始/结束位置
if (len > maxlen) {
maxlen = len;
start = i;
end = j;
}
i = j; // 处理下一个单词
}
// 输出最长的单词
for (int i = start; i < end; i++) {
putchar(str[i]);
}
putchar('\n');
}
int main() {
char str[81]; // 假设输入字符串长度不超过 80
while (fgets(str, sizeof(str), stdin)) { // 每次读入一行
findLongestWord(str); // 查找并输出最长单词
}
return 0;
}