当达到字符串末尾时,C ++ getline会导致分段错误

时间:2017-08-10 01:39:49

标签: c++ getline stringstream

我有这个简单的代码分割由&符分隔的等号组成的字符串:

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);

我正确地将3个等式收集到向量'对'中,但是while循环继续超出流的末尾,并且我得到了分段错误。怎么避免这个?

2 个答案:

答案 0 :(得分:1)

您的程序在设置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上没有警告,g ++ / gcc 4.8.5(源文件名为x.cpp),输出正确(如你所见,我添加了一行记录argdef的内容,看起来是正确的):

% g++ -Wall -o x x.cpp
% ./x
par1=1
par2=ciao
par3=1.2e4
%

所以一切都很好。

解释段错误的根本原因:

  • 您在第一行忘记的;使程序完全无法编译,而您运行的二进制文件是旧版本,带有错误;
  • 或者您的程序中还有其他任何导致分段错误的内容。

无论如何,这里显示的源代码是正确的。

答案 1 :(得分:0)

如果在代码中使用getline之前使用cin进行输入,则会发生此错误。使用getline在程序中获取所有输入,您的细分错误将消失。