1

私には単純な問題があり、SEGFAULT を引き起こしているばかげたことをしているだけだと思います。

double 変数を文字列に変換し、それらを '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()));

どうしてうまくいかないの!? :(

Boost::Lexical_Cast を使ってみましたが、うまくいきませんでした:

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

どんな助けでも大歓迎です。いずれかの方法が機能する場合、それは素晴らしいことですが、文字列でダ​​ブルから猫を取得できる限り、私はそれを行う方法についてあまり気にしません!

4

2 に答える 2

8

コンパイルさえしないはずです。コンパイラの警告レベルと適合レベルが高く設定されていることを確認してください。これにより、長期的には多くのトラブルを回避できます。

strcatの署名を見てみましょう:

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

したがって、char*最初のパラメーターとして を受け取ります。しかし、に減衰する"FPS Target: "型を持ち、 として渡すことはできません。変更はできますが、できません (文字列リテラルは変更できません!)。この最初のパラメーターは、結果が格納されるバッファーであるためです。次の理由により、その文字列リテラルに入れることはできません。char const[13]char const*char*char*char const*char*

  1. 文字列リテラルは読み取り専用です。
  2. その文字列リテラルは十分な大きさではありません。

c_str()の戻り値の型が既にであるため、2 番目の引数はキャストを必要としません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());
于 2012-08-07T17:13:07.067 に答える
1

strcat()最初のパラメーターを出力バッファーとして使用します。もちろん、strcat("FPS Target: "...)クラッシュします。バッファーを割り当てて、最初のパラメーターとして渡します。

const char* fps_target_string = (const char*) boost::lexical_cast<std::string>(fps_target)std::string から への変換がないため、コンパイルされませんconst char*

于 2012-08-07T17:13:47.883 に答える