鱼C论坛

 找回密码
 立即注册
查看: 2359|回复: 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

  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4. using namespace std;

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

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

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

  22.         }

  23.         system("pause");
  24.         return 0;
  25. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-3-30 14:14:39 | 显示全部楼层
继续求助
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这样的话直接检查一遍就好了
  1.         auto it = b.begin();
  2.         while (it != b.end()) {
  3.                 if (*it <= 32) it = b.erase(it);  //去掉所有不可打印字符和空格
  4.                 else it++;
  5.         }
复制代码
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://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++;
        }
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

能在我的源码基础上改么,您的这串代码放进去,也没有反应。。最好能给一个整个代码。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-31 16:31:25 | 显示全部楼层    本楼为最佳答案   

  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4. using namespace std;

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

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

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

  22.         }

  23.         system("pause");
  24.         return 0;
  25. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢大佬,另外想问一下,为什么是<=32?
这个用法没有见过
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


因为31及之前的是不可打印字符,32是空格
去查查ascii码表就知道了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯 已经看到了  非常感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 19:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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