C++的一个单词分类逆序输出问题

都说没想好 2014-04-22 06:30:30
编写一个程序对以空白符(包括回车换行符)为间隔的单词序列输入流进行转换输出,输出的格式是:先输出全部的小写单词,然后输出首字母大写的单词,最后输出大写单词(假设只有这三种形式的单词);且同一类的单词以与出现的顺序相反的顺序输出,也就是后出现的先输出。
譬如输入:
Write A program
That COUNTS how
MANY Times
应该输出:
小写单词:howprogram
首字母大写单词:Times That Write
大写单词:MANYCOUNTS A

我自己写了一个,不知道怎么屏幕无法输出
求指正并运行过。

#include<iostream>
#include<string>
#include<vector>

using std::cin;
using std::cout;
using std::string;
using std::vector;

int main()
{
string s,s1;
vector<string> lower,upper,twotype;
while(getline(cin,s1))
s=s+s1+' ';

typedef string::size_type string_size;
string_size i=0;

//找到单词开头
while(i!=s.size())
while(i!=s.size() && isspace(s[i]))
++i;

//找到单词结尾
string_size j=i;
while(j!=s.size() && !isspace(s[j]))
++j;

//把单词分类到不同的vector中
while(i!=s.size()&&j!=s.size()&&i!=j)
{
if(isupper(s[i])&&(isupper(s[i+1])||isspace(s[i+1])))
upper.push_back(s.substr(i,j-i));
else if(islower(s[i]))
lower.push_back(s.substr(i,j-i));
else
twotype.push_back(s.substr(i,j-i));
}

//倒序输出
int k;
for(k=lower.size();k!=0;k--)
cout<<lower[k]<<std::endl;
for(k=upper.size();k!=0;k--)
cout<<upper[k]<<std::endl;
for(k=twotype.size();k!=0;k--)
cout<<twotype[k]<<std::endl;

return 0;
}
...全文
222 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝兔先生 2014-04-23
  • 打赏
  • 举报
回复
看到后出现的先输出这类关键字, 第一反应就想到了栈
都说没想好 2014-04-23
  • 打赏
  • 举报
回复
谢谢你~ 但是我还想知道我的程序究竟错在哪里。。。
temperlancer 2014-04-22
  • 打赏
  • 举报
回复
哦, 对了刚才忘了说了, 输入完了以后请按个回车, 再按个ctrl+D, 这样才能出来结果. 按个回车是为了好看, 按ctrl+D是因为你要是不给cin 喂一个EOF的话这程序就一直在那等着你的输入..
temperlancer 2014-04-22
  • 打赏
  • 举报
回复
首先, 抱歉, 我没有详细的看你的code, 我就直接写了一份我的, 你就当做参考. 其次, 说一下程序, 反序输出相当于一个stack, 后进先出, 但由于stack需要执行pop和push操作, 比较繁琐, 所以使用了deque. 每次把最后进来的元素放到deque的最前面, 当分类逻辑执行完了以后, 在从头开始打印deque中的每个元素即可. 下面是代码:
//编写一个程序对以空白符(包括回车换行符)为间隔的单词序列输入流进行转换输出,输出的格式是:
//先输出全部的小写单词,然后输出首字母大写的单词,最后输出大写单词(假设只有这三种形式的单词);
//且同一类的单词以与出现的顺序相反的顺序输出,也就是后出现的先输出。

#include <iostream>
#include <string>
#include <deque>
#include <iterator>

using namespace std;

void deque_printer(deque<string>& data){
    deque<string>::iterator iter;
    for(iter = data.begin(); iter != data.end(); ++iter){
        cout << *iter << " " << ends;
    }
}

int main()
{
    string temp_string;
    string::iterator str_iter;
    deque<string> lower, mixed, upper;
    typename deque<string>::iterator iter;
    
    while(cin >> temp_string){
        for(str_iter = temp_string.begin(); str_iter != temp_string.end(); ++str_iter){
            if(islower(*str_iter)){
                lower.push_front(temp_string);
                break;
            }
            else{
                ++str_iter;
                if(str_iter == temp_string.end()){
                    upper.push_front(temp_string);
                    break;
                }
                else{
                    if(islower(*str_iter)){
                        mixed.push_front(temp_string);
                        break;
                    }
                    else{
                        upper.push_front(temp_string);
                        break;
                    }
                }
            }
        }
    }
    
   deque_printer(lower);
   cout << endl;
   
   deque_printer(mixed);
   cout << endl;
   
   deque_printer(upper);
   cout << endl;

}

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧