如何告诉 stringstream 忽略空终止符?
How to tell stringstream to ignore null terminating character?
有什么方法可以告诉字符串流忽略空终止字符并读取一定数量的字符吗?
正如您从这个最小示例中看到的,即使 char 数组由 3 个字符组成,stringstream 在第二个位置终止:
#include <sstream>
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
char test[3];
test[0] = '1';
test[1] = '[=10=]';
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
这个问题不是关于字符串流的。问题是您正在为该字符串流构造函数参数从 const char*
隐式构造 std::string
,并使用需要 C 字符串的重载来这样做。因此,自然地,您应该期待类似 C 字符串的行为。
相反,您可以使用 std::string(const char*, std::size_t)
构造函数形成参数,或使用 .write
.
将数据发送到默认构造的字符串流
除了解释潜在问题的另一个答案(从 char*
创建 std::string
)之外,这里有一个(许多)解决问题的方法,使用 std::string_literals
:
#include <iostream>
#include <string>
#include <sstream>
int main(){
using namespace std::string_literals;
const std::string str_with_null = "1[=10=]02"s;
std::stringstream ss(str_with_null);
char c;
while (ss.get(c)) {
std::cout << static_cast<int>(c) << '\n';
}
}
当运行时,应该打印出:
49
0
50
有什么方法可以告诉字符串流忽略空终止字符并读取一定数量的字符吗?
正如您从这个最小示例中看到的,即使 char 数组由 3 个字符组成,stringstream 在第二个位置终止:
#include <sstream>
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
char test[3];
test[0] = '1';
test[1] = '[=10=]';
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
这个问题不是关于字符串流的。问题是您正在为该字符串流构造函数参数从 const char*
隐式构造 std::string
,并使用需要 C 字符串的重载来这样做。因此,自然地,您应该期待类似 C 字符串的行为。
相反,您可以使用 std::string(const char*, std::size_t)
构造函数形成参数,或使用 .write
.
除了解释潜在问题的另一个答案(从 char*
创建 std::string
)之外,这里有一个(许多)解决问题的方法,使用 std::string_literals
:
#include <iostream>
#include <string>
#include <sstream>
int main(){
using namespace std::string_literals;
const std::string str_with_null = "1[=10=]02"s;
std::stringstream ss(str_with_null);
char c;
while (ss.get(c)) {
std::cout << static_cast<int>(c) << '\n';
}
}
当运行时,应该打印出:
49
0
50