2016-10-24 7 views
-1

私は自分自身を、文字列をとり、特定の文字の後にその言葉を与えるプログラムにしようとしています。したがって、たとえば:特定の文字の後に単語を取得しますか?

String theString = "hello \t world"; // or "borld \t bello"; 

タブの後、私は「世界」だけでなく「こんにちは」を望んでいます。これはなんらかの理由で私に衝突し続けます。

size_t delimiter = theString.find_last_of('\t'); 
char *test; 

if (theString.find("hello") != string::npos) { 
    strcpy(test, theString.substr(delimiter + 1).c_str()); 
else if (theString.find("borld") != string::npos) { 
    strcpy(test, theString.substr(delimiter + 1).c_str()); 
} 

cout << test; 
+3

_これは何らかの理由で私にクラッシュしてしまいます。_もちろん、 'char * test;'のためのスペースは決して割り当てられません。 –

答えて

0

strcpyマニュアルから:

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

文字列がに、 終端のNULLバイト( '\ 0')を含む、srcで指さのstrcpy()関数をコピーdestがポイントするバッファ。

コードでtestchar*へのポインタとして宣言しますが、決して初期化しません。

testは、不確定値へのポインタです。その後、クラッシュするクラッシュの原因となっているinderminateの場所にデータをコピーしようとします。

teststrcpyにメモリを指すように初期化することで、これを簡単に修正できます。バッファーを越えて書き込めないようにしてください。

0

初期化せずにテストするように書き込むのはいつも同じミスですか?

char *test; // no memory allocated so using it will cause a segfault 
char test[50]; // just for explaining we allocate 50 bytes for pointer test 
// char* test = new char[50]; // the same above but here dynamic memory 
// delete[] test; // free up memory because dynamic memory is not automatically freed 
関連する問題