2012-04-20 4 views
0

これは私の簡単なプログラムConst char ... changed? mypathでその奇妙な文字列に変更されたのはなぜ

string appData = getenv("APPDATA"); 
const char *mypath= (appData+"\\MyApplication\\hello.txt").c_str();  
cout << mypath; 
// output: c:\users\xrobot\appdata\Roaming\Myapplication\hello.txt 
fstream file(mypath,ios::in); 
ofstream filetemp;  
filetemp.open("world.bak"); 
cout << mypath; 
// output: É↕7 

の部分ですか?

+5

このコードがコンパイルされるのに驚いています。あなたはstd :: stringのようにcstringを扱っています。 – SuperJames

+1

4行目に "c:\ users \ xrobot \ appdata \ Roaming \ Myapplication \ hello.txt"という出力が表示された場合は、実行している実際のコードがここにあるとは思いません。むしろ、私は2行目にコンパイラエラーがあると思います。実際のコードを見ることはできますか?あなたが与えた症状から、私はあなたの本当のコードでは、std :: stringでc_str()を呼び出し、std :: stringが宣言されたスコープから離れる間に返されたポインタを保持していると考えています。代わりにstd :: stringに変換します。 – moonshadow

答えて

7

あなたは使うべきstd::stringとして:

const char* mypath = (appData+"\\MyApplication\\hello.txt").c_str(); 

それは上の式からです:あなたははこれをしない必要があります

const char * mypath = path.c_str(); 

注:

std::string appData = getenv("APPDATA"); 
std::string path = appData+"\\MyApplication\\hello.txt"; 

は、これを行います右手側は一時的なもので、デストロイを得るdを指定し、mypathは破壊されたオブジェクトを指し続けます。これはぶら下がりのポインタになります。

-

はなぜmypathではその奇妙な文字列に変更されましたか?

あなたの投稿コードでは、mypathは未定義の動作を引き起こすダングリングポインタです。

これは、あなたがコードを書くべきかです:

std::string appData = getenv("APPDATA"); 
std::string mypath= appData+"\\MyApplication\\hello.txt"; 
cout << mypath; 
fstream file(mypath.c_str(),ios::in); 
5

このような2つの文字列を追加することはできません。明確な警告が表示されます。 C++を使用しているので、代わりにstd::stringを使用することができます。

2

これは単なる一時的なstd::stringです:

(appData+"\\MyApplication\\hello.txt") 

式が使用された後、だから、基礎となるCの文字列領域を解放することができます。 char*は現在ガベージメモリを指しているので、あなたはファンキーな価値があります。

+0

Ewwwwww。最初の機会に安全でない 'strxxx'インターフェースに戻る場合、' std :: string'を使用する点は何ですか? –

+0

@ R.MartinhoFernandes OPは 'strcat()'を使用しないことには断固としているようです。彼の葬儀。 – chrisaycock

+1

マジック長のバッファは使用しないでください。 –

関連する問題