18689979153 发表于 2019-3-30 09:08:46

读取一行字符串并以大写输出

#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;
}

18689979153 发表于 2019-3-30 14:14:39

继续求助

Croper 发表于 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++;
        }

18689979153 发表于 2019-3-30 15:39:16

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

是这样的,比方说我想输入:wang er   xiaoshi       da   yingxiong(此时在控制台按回车)
希望得到这样的结果:WANGERXIAOSHIDAYINGXIONG
就是说能够略掉空格并以大写输出。
第一次用:cin>>b;输出的就只有WANG
第二次用:getline(cin,b);全部转成了大写,但是空格都在
第三次尝试:while(getline(cin,b));输入后控制台无反应。
这是C++primer 第五版的练习3.22

Croper 发表于 2019-3-30 16:04:14

答案看全成么这样的话直接检查一遍就好了
      auto it = b.begin();
      while (it != b.end()) {
                if (*it <= 32) it = b.erase(it);//去掉所有不可打印字符和空格
                else it++;
      }

18689979153 发表于 2019-3-31 14:29:48

Croper 发表于 2019-3-30 16:04
答案看全成么

能在我的源码基础上改么,您的这串代码放进去,也没有反应。。{:5_100:}最好能给一个整个代码。。。

Croper 发表于 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;
}

18689979153 发表于 2019-3-31 20:42:39

Croper 发表于 2019-3-31 16:31


谢谢大佬,另外想问一下,为什么是<=32?
这个用法没有见过

Croper 发表于 2019-3-31 21:13:37

18689979153 发表于 2019-3-31 20:42
谢谢大佬,另外想问一下,为什么是

因为31及之前的是不可打印字符,32是空格
去查查ascii码表就知道了

18689979153 发表于 2019-4-1 08:53:33

Croper 发表于 2019-3-31 21:13
因为31及之前的是不可打印字符,32是空格
去查查ascii码表就知道了

嗯 已经看到了非常感谢
页: [1]
查看完整版本: 读取一行字符串并以大写输出