2017-02-28 154 views
-2

我有這樣的函數:如何使用stringstream將字符串轉換爲char *?

template <typename T> 
void parse_to_T(const std::string& str, T* result) { 
    std::stringstream ss; 
    ss << str; 
    ss >> *result; 
} 

這個功能是指將字符串轉換爲指定的類型。

是工作解析字符串爲int,float和char。

parse_to_T<int>(...); 
parse_to_T<float>(...); 
parse_to_T<char>(...); 

但是當見面的char *,段故障...

我使用這樣的功能:

int int_val; 
string m = "1"; 
parse_to_T<int>(m, &int_val); // works 
char* str_val = NULL; 
parse_to_T<char*>(m, &str_val); // segmentfault 

如何暗示這一功能,使其工作?

(字符串轉換爲指定的類型如int,雙,字符,字符*)?

嘿,我不知道該怎麼解釋我的使用情況,但我會努力:

要簡單,問題是,給定一個文件,每行,數據可能有這幾種:

  • INT
  • 浮子
  • 字符*
  • 陣列T [NUM](T是整數,浮點,字符或字符*,或任何build_in類型)。

實現一個解析函數來解析這個文件。

而這個問題是考試......


感謝,我現在發現的錯誤。

char* str_val = NULL; 
parse_to_T<char*>(m, &str_val); // segmentfault; 
char* str_val; 
parse_to_T<char*>(m, &str_val); // segmentfault; 
char* str_val = new char[256]; 
parse_to_T<char*>(m, &str_val); // works !! 

那麼錯誤是我沒有分配內存的PTR ...

+0

您正在解除引用未初始化的指針 – Tas

+0

我不認爲您會找到類似['std :: stod']的函數(http://en.cppreference.com/w/cpp/string/basic_string/stof )和['std :: stoi'](http://en.cppreference.com/w/cpp/string/basic_string/stol)系列更吸引人?在我看來,你正試圖在這裏重新發明輪子。 – WhozCraig

+0

@Tas對不起。我只是忘了鍵入它的問題。 –

回答

2

此段錯誤是因爲stringstream在將值提取到char*數組時未分配內存來保存操作結果。它試圖將這些值放入lhs操作數指向的內存中。你必須自己分配記憶。

下面是一個簡單的例子:

#include <string> 
#include <sstream> 
#include <iostream> 

template <typename T> 
void parse_to_T(const std::string& str, T* result) { 
    std::stringstream ss; 
    ss << str; 
    std::cout << ss.str() << std::endl; 
    ss >> *result; 
    std::cout << *result << std::endl; 
} 

int main() { 
    char* buffer = new char[256]; 
    /* Don't do this in real code. If the input is larger than 
     the size of the buffer it will end very, very badly. 
     always have a way of allocating the correct amount 
     of memory. 
    */ 
    int int_val; 
    std::string m = "1"; 
    parse_to_T<int>(m, &int_val); 
    char* str_val = NULL; 
    parse_to_T<char*>(m, &buffer); 
    delete[] buffer; 
    return 0; 
} 

你可以包括對char*數據類型,它基於數據流中的量分配(調用stringstream.str().size()應該工作)模板專業化,但用戶將必須釋放返回的內存。

+1

請注意固定長度數組:如果輸入較大,則會溢出,或者可能存在安全問題。即使輸入的規格說明了最大長度,最後也是如此,但它總是可以被妥協。 – cbuchart

+2

不需要'new'。將緩衝區分配爲臨時值,並讓編譯器處理它。 – user4581301

+0

偉大的點cbuchart。我編輯了我的答案以反映這一點。 – JeremiahB

1

首先,你的目標變量str_val沒有分配的內存,所以這是正常的,你有一個分段錯誤。

另一方面,如果您改爲使用std::string會更好。如果你需要原始指針const char*那麼你可以使用std::string::c_str。如果你必須修改它,那麼只需創建一個副本。

相關問題