2012-08-07 59 views
1

我有一個簡單的問題,我認爲我只是在做一些愚蠢的事情導致SEGFAULT。將double轉換爲字符串。 Boost庫似乎不工作,並導致「SEG FAULT」

我只是想將一個雙變量轉換爲一個字符串,然後將它們'strcat()'放在一起,並將生成的連接字符串放入GTK標籤中。 (這應該是簡單的,肯定?!)

這裏是我的代碼段:

double fps_target = 2.71828 
std::string fps_target_string; 
std::stringstream convert; 
convert << fps_target; 
fps_target_string = convert.str(); 
g_print("seg fault occurs below"); 
label_fps_target = gtk_label_new(strcat("FPS Target: ", 
    (const char*) fps_target_string.c_str())); 

爲什麼不能正常工作? :(

我嘗試使用升壓:: lexical_cast的事情,但沒有奏效。

double fps_target = 3.14159; 
const char* fps_target_string = (const char*) (boost::lexical_cast<std::string>(fps_target)); 

任何幫助是極大的讚賞。如果這兩種方法的作品,這將是真棒,但我不真的很困擾如何做到這一點,只要我可以得到一個字符串的雙重貓!

回答

8

它甚至不應該編譯。確保你的編譯器的警告和一致性級別設置爲高。這將節省從長遠來看,你很麻煩。

讓我們看看strcat's signature

char *strcat(char *dest, const char *src); 

因此,它需要一個char*作爲第一個參數。但"FPS Target: "的類型爲char const[13],其衰減爲char const*,不能作爲char*傳遞。 char*允許修改,但char const*不(字符串文字不可變!)。這第一個參數是char*,因爲這是放置結果的緩衝區。你不能把它放在字符串文字中,因爲:

  1. 字符串文字是隻讀的;
  2. 該字符串文字不夠大。

第二個參數不需要強制轉換,因爲返回類型c_str()已經是char const*

連接字符串的最簡單方法是使用std::string而不用打擾C庫字符串操作函數。

std::string result = "FPS Target: " + fps_target_string; 
g_print("seg fault doesn't occur below"); 
label_fps_target = gtk_label_new(result.c_str()); 

由於代碼已經被使用stringstream,更簡單的方法是隻兩部分插入流。

std::stringstream convert; 
convert << "FPS Target: " << fps_target; 
std::string result = convert.str(); 
g_print("seg fault doesn't occur below"); 
label_fps_target = gtk_label_new(result.c_str()); 
+0

Aaach!當然,非常感謝這麼多人。我知道我在做一些愚蠢的事情! – user3728501 2012-08-07 17:18:16

+0

很高興幫助。歡迎來到Stack Overflow。 – 2012-08-07 17:45:38

1

strcat()使用第一個參數作爲輸出緩衝區。當然,strcat("FPS Target: "...)會崩潰。分配一個緩衝區並將其作爲第一個參數傳遞。

const char* fps_target_string = (const char*) boost::lexical_cast<std::string>(fps_target)不會編譯,因爲沒有從std :: string到const char*的轉換。

相關問題