2017-08-10 44 views
0

我有這樣的簡單的代碼分割製成由&符號分隔等式的字符串:C++在段故障函數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); 

我正確地收集3個等式到載體「對」 ,但同時循環繼續超出流的末尾,我得到一個分段錯誤。如何避免這種情況?

+0

[Can not reproduce。](http://coliru.stacked-crooked.com/a/35cfe24f53a60b49) – aschepler

+0

很確定getline會通過null結束符發揮作用。嘗試添加一個'&'到你的字符串的末尾?沒關係... stringstream應該爲你處理eof。 – zzxyz

回答

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 
% 

所以這裏一切都很好。

說明你的段錯誤錯誤的根本原因:

  • 要麼;你已經在第一行遺忘使程序不能編譯,而你正在運行的二進制是一箇舊的,有錯誤;
  • 或者您的程序中有其他任何內容會導致分段錯誤。

無論如何,這裏顯示的源代碼是正確的。

+0

';'只在我的問題中缺失。實際上發佈的代碼是在一個函數中,將字符串作爲參數。這是唯一的區別,否則代碼是相同的。我與交叉在Cygwin MinGW的64位編譯。它編譯時沒有警告,但是在運行時我遇到了分段錯誤。我會盡力來檢查我的代碼其他地方,但它的奇怪,因爲它停止工作什麼時候我已經添加字符串分割功能。 – Hybridslinky