如何告诉stringstream忽略空终止符?

时间:2019-11-02 21:08:21

标签: c++ istream

有什么办法告诉字符串流忽略以null结尾的char并反正读取一定数量的char?

从这个最小的示例中可以看到,即使char数组由3个char组成,stringstream也会终止于第二个位置:

#include <sstream>
#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {
        char test[3];
        test[0] = '1';
        test[1] = '\0';
        test[2] = '2';

        stringstream ss(test);

        char c;
        cout << "start" << endl;
        while (ss.get(c)) {
                cout << c << endl;
        }

        if (ss.eof()) {
                cout << "eof" << endl;
        }
}
$ ./a.out 
start
1
eof

2 个答案:

答案 0 :(得分:4)

此问题与字符串流无关。问题是您正在从std::string隐式地为该stringstream构造函数参数构造一个const char*,并使用期望C字符串的重载来实现。因此,自然地,您应该期待类似C字符串的行为。

相反,您可以使用std::string(const char*, std::size_t)构造函数来形成参数,或者使用.write将数据发送到默认构造的字符串流。

答案 1 :(得分:2)

除了解释基本问题(从std::string创建char*的其他答案)之外,还有以下(多种)解决问题的一种方法,使用std::string_literals

#include <iostream>
#include <string>
#include <sstream>

int main(){
  using namespace std::string_literals;
  const std::string str_with_null = "1\0002"s;
  std::stringstream ss(str_with_null);
  char c;
  while (ss.get(c)) {
    std::cout << static_cast<int>(c) << '\n';
  }
}

运行时,应打印出来:

49
0
50