【题目链接】
ybt 1149:最长单词2
OpenJudge NOI 1.13 16:最长单词2
【题目考点】
1. 字符串遍历
2. 处理多个字符串
3. while(cin >> …)读入字符串
适合于读入多个由空格分开的字符串
string s;
while(cin >> s)
{
//...
}
调试时,输入Ctrl+z,按回车,即可结束输入,观察输出。
【题解代码】
解法1:遍历字符串
用一个字符数组保存当前查看的单词、最长单词,用变量保存最长单词长度。
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[505], word[505], mxWord[505];//s:完整字符串 word:当前查看的单词 mxWord:最长单词
cin.get(s, 505);
int ct = 0, ctMax = 0, wi = 0, len;//ct:单词中字母计数 ctMax:最大单词长度 word_sp:最长单词开始的位置
len = strlen(s);
for(int i = 0; i < len; ++i)
{
if(s[i] == ' ' || s[i] == '.')
{
word[wi] = '\0';//单词末尾加'\0',构成字符串
wi = 0;//wi还原,等待下次向word字符数组赋值
if(ct > ctMax)//如果该单词长度比已知最长的单词长度更长
{
ctMax = ct;//ctMax记录最长单词长度
strcpy(mxWord, word);//mxWord保存最长的单词
}
ct = 0;
}
else
{
ct++;//单词长度计数
word[wi++] = s[i];//将当前查看的字符s[i]填入word字符串中
}
}
cout<<mxWord;
return 0;
}
解法2:将该句子分解为多个单词,然后找各单词中的最长单词。
分解出的多个单词可以保存在二维字符数组或string类数组中。该解法用string类数组。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s, word[505];
getline(cin, s);//输入带空格的字符串
int ws, wi = 0, mxi = 0;//ws:单词首字母下标 , wi:word数组下标, mxi:最长单词下标
for(int i = 0; i < s.length(); ++i)//遍历字符串
{
if(s[i] == ' ' || s[i] == '.')//当i位置是空格
{
word[wi++] = s.substr(ws, i - ws);//从ws位置开始,截取i-ws长度,即为一个单词
ws = i + 1;//截取后,下个单词首字母位置为i + 1
}
}
for(int i = 0; i < wi; ++i)//求最长单词
{
if(word[i].length() > word[mxi].length())
mxi = i;
}
cout<<word[mxi];
return 0;
}
解法3:使用while(cin >>…)
适合于读入多个用空格分开的字符串
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s, s_mx;
while(cin >> s)
{
if(s[s.length()-1] == '.')//如果末尾是句号'.'
s.pop_back();//删去末尾字符
if(s.length() > s_mx.length())
s_mx = s;
}
cout << s_mx;
return 0;
}