【问题标题】:C++ getline results in segmentation fault when the end of the string is reached到达字符串末尾时,C++ getline 导致分段错误
【发布时间】:2018-01-18 01:50:43
【问题描述】:

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

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

我正确地将三个等式收集到向量“对”中,但是 while 循环继续超出流的末尾,并且出现分段错误。如何避免这种情况?

【问题讨论】:

  • 相当肯定 getline 会直接通过空终止符。尝试在字符串末尾添加&amp;?没关系...stringstream 应该为您处理 eof。

标签: c++ getline stringstream


【解决方案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
%

所以这里一切都很好。

段错误的根本原因说明:

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

不管怎样,这里显示的源代码是正确的。

【讨论】:

  • ';'仅在我的问题中丢失。实际上,发布的代码位于以字符串为参数的函数中。这是唯一的区别,否则代码是相同的。我在 cygwin 上使用 mingw 64 位进行交叉编译。它编译时没有警告,但在运行时出现分段错误。我会尝试检查我的代码的其他部分,但这很奇怪,因为它在我添加字符串拆分功能时完全停止工作。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2020-03-20
    相关资源
    最近更新 更多