当到达字符串末尾时,C++ getline 导致分段错误
C++ getline results in segmentation fault when the end of the string is reached
我有这个简单的代码来拆分由与号分隔的等号组成的字符串:
std::string cmd = "par1=1&par2=ciao&par3=1.2e4"
std::stringstream ss(cmd);
std::string argdef;
std::vector<std::string> pairs(0);
while (std::getline(ss, argdef, '&'))
pairs.push_back(argdef);
我正确地将三个等式收集到向量 'pairs' 中,但是 while 循环继续超出流的末尾,我遇到了分段错误。如何避免这种情况?
您的程序需要在设置 cmd 值的行末尾有一个 ;
。
你展示的源码没有问题(如果加上;
)。我们可以在没有警告的情况下编译它并且它运行良好,如果我们添加一些行使其成为一个自治程序:
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
int main(int ac, char **av) {
std::string cmd = "par1=1&par2=ciao&par3=1.2e4";
std::stringstream ss(cmd);
std::string argdef;
std::vector<std::string> pairs(0);
while (std::getline(ss, argdef, '&')) {
std::cout << argdef << std::endl;
pairs.push_back(argdef);
}
return 0;
}
例如,编译在 Linux OpenSuSE LEAP 42.1 with g++/gcc 4.8.5 上没有警告(源文件名为 x.cpp),输出是正确的(如你可以看到,我添加了一行来记录 argdef 的内容,它看起来是正确的):
% g++ -Wall -o x x.cpp
% ./x
par1=1
par2=ciao
par3=1.2e4
%
所以这里一切都很好。
对您的段错误的根本原因的解释:
- 要么你在第一行忘记的
;
使程序根本无法编译,而你的二进制文件 运行 是一个旧的,有错误;
- 或者您的程序中有任何其他导致分段错误的内容。
无论如何,这里显示的源代码是正确的。
如果您在代码中使用 getline 之前使用 cin 获取输入,则会发生此错误。在您的程序中使用 getline 获取所有输入,您的分段错误将消失。
我有这个简单的代码来拆分由与号分隔的等号组成的字符串:
std::string cmd = "par1=1&par2=ciao&par3=1.2e4"
std::stringstream ss(cmd);
std::string argdef;
std::vector<std::string> pairs(0);
while (std::getline(ss, argdef, '&'))
pairs.push_back(argdef);
我正确地将三个等式收集到向量 'pairs' 中,但是 while 循环继续超出流的末尾,我遇到了分段错误。如何避免这种情况?
您的程序需要在设置 cmd 值的行末尾有一个 ;
。
你展示的源码没有问题(如果加上;
)。我们可以在没有警告的情况下编译它并且它运行良好,如果我们添加一些行使其成为一个自治程序:
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
int main(int ac, char **av) {
std::string cmd = "par1=1&par2=ciao&par3=1.2e4";
std::stringstream ss(cmd);
std::string argdef;
std::vector<std::string> pairs(0);
while (std::getline(ss, argdef, '&')) {
std::cout << argdef << std::endl;
pairs.push_back(argdef);
}
return 0;
}
例如,编译在 Linux OpenSuSE LEAP 42.1 with g++/gcc 4.8.5 上没有警告(源文件名为 x.cpp),输出是正确的(如你可以看到,我添加了一行来记录 argdef 的内容,它看起来是正确的):
% g++ -Wall -o x x.cpp
% ./x
par1=1
par2=ciao
par3=1.2e4
%
所以这里一切都很好。
对您的段错误的根本原因的解释:
- 要么你在第一行忘记的
;
使程序根本无法编译,而你的二进制文件 运行 是一个旧的,有错误; - 或者您的程序中有任何其他导致分段错误的内容。
无论如何,这里显示的源代码是正确的。
如果您在代码中使用 getline 之前使用 cin 获取输入,则会发生此错误。在您的程序中使用 getline 获取所有输入,您的分段错误将消失。