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

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

我正确地将三个等式收集到 vector “对”中,但是 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;
 }

例如,编译在带有 g++/gcc 4.8.5 的 Linux OpenSuSE LEAP 42.1 上没有警告(源文件名为 x.cpp),并且输出是正确的(如您所见,我添加了记录 argdef 内容的一行,看起来是正确的):

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

所以这里一切都很好。

对您的段错误的根本原因的解释:

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

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

关于当到达字符串末尾时,C++ getline 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45603105/

相关文章:

c++ - 如何在 C++ 中使用 sort() 函数一起做某事?

c++ - 当右值引用被拷贝捕获时会发生什么?

c++ - 创建包含字符串和 std::endl 的变量,可用于 std::cout 的输出流

c++ - 程序正在跳过 getline ()/C++

c++ - Stringstream 没有输入添加了结束符的字符串

c++ - 提取多个单词到一个字符串变量

c++ - 返回值作为函数参数

c++ - &-运算符/C++,解释

c++ - 我对 cin.getline() 做错了什么?

c - 在C中的字符串前后添加一些字母