秋山玉佩 2023-05-03 11:44 采纳率: 100%
浏览 19
已结题

stringstream 通过字符串直接初始化后clear失效?(语言-c++)

stringstream 通过字符串直接初始化后clear失效?
其实从rdstate的返回值来看的话,clear的效果是还有的,复原了状态值,但无法让字符串流再流入string型变量

#include <vector>
#include <sstream>
#include <string>
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
    int flag;
    scanf("%d ", &flag);//是与问题无关的int变量
    vector<string>first, second;//两个vector 容器,分别存储第二行和第三行的字符串
    string str1, str2,tmp;
    getline(cin, str1);
    getline(cin, str2);//输入
    stringstream input;//应用字符串流,第二次操作时改为stringstream input(str1);
    input << str1;//读入字符串,第二次操作时这一行不要了
    cout << input.rdstate() << endl;
    while (input >> tmp)
        first.push_back(tmp);//生成<string>vector
    cout << input.rdstate() << endl;
    input.clear();
    cout << input.rdstate() << endl;
    input << str2;
    cout << input.rdstate() << endl;
    while (input >> tmp)
        second.push_back(tmp);
    cout << input.rdstate() << endl;
    cout << first.size() << endl << second.size() << endl;
    return 0;
}

这样操作是正常的,第一次结果如下

img

第二次操作对代码的修改只是改变了字符串流对象的初始化方式,详见代码注释
结果如下

img

注意到两次输出唯一的差别在于第二个vector的size是否为空。请问各位king谁能解释其中的原理?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-03 14:27
    关注
    • 以下回答由chatgpt基于相关博客总结生成:

      对于stringstream,通过字符串初始化后,里面已经是一个完整的字符串了,所以clear并不能清空里面的内容,只是为了用来清空标志位。如果想要再次输入流,可以使用str函数将其清空,再输入新的数据。

      具体步骤如下: 1. 通过stringstream的构造函数,将字符串初始化为一个stringstream对象。

      stringstream ss("1 2 3");
      
      1. 使用>>操作符将stringstream对象中的数字流入一个int型的变量。
      int num;
      ss >> num;
      
      1. 使用clear清空标志位,并使用str函数清空stringstream对象。
      ss.clear();
      ss.str("");
      
      1. 通过>>操作符再次将stringstream对象中的数字流入其他变量中。
      int num2;
      ss >> num2;
      

      对于第二个问题,通过输出rdstate的返回值可以看出clear的效果,因为rdstate的返回值反映了stringstream对象的状态。当第一次输入时,stringstream对象中没有任何错误,rdstate返回0。当第二次输入时,由于字符串中只有一个数字,所以读取完后并没有结束读入,所以rdstate返回4(EOF)。而不管是0还是4,执行clear操作后都应该是可以再次输入的,如果第二个vector的size为空,很有可能是没有清空或者没有正确输入到vector中。

      代码示例如下:

      #include <iostream>
      #include <sstream>
      #include <vector>
      
      using namespace std;
      
      int main() {
          stringstream ss("1 2 3");
          int num1, num2, num3;
          ss >> num1;
          ss >> num2;
          ss >> num3;
          cout << ss.rdstate() << endl;
          ss.clear();
          ss.str("");
          stringstream ss2("4");
          ss2 >> num1;
          ss2 >> num2;
          vector<int> vec;
          ss2 >> num3;
          vec.push_back(num1);
          vec.push_back(num2);
          vec.push_back(num3);
          cout << ss2.rdstate() << endl;
          cout << vec.size() << endl;
          return 0;
      }
      

      输出结果:

      0
      4
      3
      
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月14日
  • 已采纳回答 5月6日
  • 创建了问题 5月3日