鱼C论坛

 找回密码
 立即注册
查看: 1965|回复: 9

[已解决]读取一行字符串并以大写输出

[复制链接]
发表于 2019-3-30 09:08:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main(){
        vector<string> a;
        string b;
        cout << "输入字符串:";
        while (getline(cin,b))  //问题出在这一行,如果换成getline(cin,b),初步满足要求,但是未去除空格;使用while时,程序没有响应
        a.push_back(b);

       for (auto it = a.begin(); it != a.end() && !it->empty(); it++){      //it为一个迭代器,遍历全部字符串,遇空串停止循环
                for (auto it2 = it->begin(); it2 != it->end(); it2++)            //利用迭代器遍历当前字符串
                        *it2 = toupper(*it2);                                              //改写成大写形式
                        cout << *it << endl;
               
        }

        system("pause");
        return 0;
}
最佳答案
2019-3-31 16:31:25
#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main() {
        vector<string> a;
        string b;
        cout << "输入字符串:";
        getline(cin, b);  //这儿直接getline
////////////////////////////////////////////////////////////////////////

        auto it = b.begin();
        while (it != b.end()) {
                if (*it <= 32) it = b.erase(it);  //去掉所有不可打印字符和空格
                else it++;
        }
/////////////////////////////////////////////////////////////////
        a.push_back(b);

        for (auto it = a.begin(); it != a.end() && !it->empty(); it++) {      
                for (auto it2 = it->begin(); it2 != it->end(); it2++)           
                        *it2 = toupper(*it2);                                           
                cout << *it << endl;

        }

        system("pause");
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-3-30 14:14:39 | 显示全部楼层
继续求助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-30 14:39:22 | 显示全部楼层
一般来说,"一行"的意思是只要cin>>b;就好。
我看楼主的意思"一行"是非得换行符分割的一行,而且还要把“一行”中所有的空格都去掉,是这样么?

这样的话直接检查一遍就好了
        auto it = b.begin();
        while (it != b.end()) {
                if (*it <= 32) it = b.erase(it);  //去掉所有不可打印字符和空格
                else it++;
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-30 15:39:16 | 显示全部楼层
Croper 发表于 2019-3-30 14:39
一般来说,"一行"的意思是只要cin>>b;就好。
我看楼主的意思"一行"是非得换行符分割的一行,而且还要把“ ...

是这样的,比方说我想输入:wang er   xiao  shi       da   ying  xiong(此时在控制台按回车)
希望得到这样的结果:WANGERXIAOSHIDAYINGXIONG
就是说能够略掉空格并以大写输出。
第一次用:cin>>b;输出的就只有WANG
第二次用:getline(cin,b);全部转成了大写,但是空格都在
第三次尝试:while(getline(cin,b));输入后控制台无反应。
这是C++primer 第五版的练习3.22
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-30 16:04:14 | 显示全部楼层
答案看全成么
这样的话直接检查一遍就好了
        auto it = b.begin();
        while (it != b.end()) {
                if (*it <= 32) it = b.erase(it);  //去掉所有不可打印字符和空格
                else it++;
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-31 14:29:48 | 显示全部楼层

能在我的源码基础上改么,您的这串代码放进去,也没有反应。。最好能给一个整个代码。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-31 16:31:25 | 显示全部楼层    本楼为最佳答案   
#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main() {
        vector<string> a;
        string b;
        cout << "输入字符串:";
        getline(cin, b);  //这儿直接getline
////////////////////////////////////////////////////////////////////////

        auto it = b.begin();
        while (it != b.end()) {
                if (*it <= 32) it = b.erase(it);  //去掉所有不可打印字符和空格
                else it++;
        }
/////////////////////////////////////////////////////////////////
        a.push_back(b);

        for (auto it = a.begin(); it != a.end() && !it->empty(); it++) {      
                for (auto it2 = it->begin(); it2 != it->end(); it2++)           
                        *it2 = toupper(*it2);                                           
                cout << *it << endl;

        }

        system("pause");
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-31 20:42:39 | 显示全部楼层

谢谢大佬,另外想问一下,为什么是<=32?
这个用法没有见过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-31 21:13:37 | 显示全部楼层
18689979153 发表于 2019-3-31 20:42
谢谢大佬,另外想问一下,为什么是


因为31及之前的是不可打印字符,32是空格
去查查ascii码表就知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-1 08:53:33 | 显示全部楼层
Croper 发表于 2019-3-31 21:13
因为31及之前的是不可打印字符,32是空格
去查查ascii码表就知道了

嗯 已经看到了  非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 14:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表