2012-02-16 19 views
3

stringchar *に変換する方法次の方法を使用していましたが、機能しません。C++で文字列をchar *に変換する方法は?

実行時には、それは私に次のエラーを与える:

Run-Time Check Failure #3 - The variable 'url' is being used without being initialized.

コード怒鳴るに示すように、私はそれを初期化してきた本家。あなたは私に例を示してもらえますか?私は、MicrosoftのVisual Studio 2010を使用してい

char* url; 
    sup = "news" 
    sup="http://www."+sup+"yahoo.com"; 
    strcpy(url, sup.c_str()); 

、コンソールでのC++

+0

文字ポインタを使用したい場合は、単に変数 'url'に等しいバイト数を割り当てる代わりに、単にsup.c_str()を使うだけです。 – PermanentGuest

+0

@Unni const char *(char *だけではない)です。しかし、私はそれが実際に必要なものかもしれないことに同意します。 – adelphus

+1

レガシーシステムに渡す必要があるまで、私は 'std :: string'をどこでも使用します。そして 'std :: string :: c_str()'を使います。 'std :: string'を使うことができない理由はありますか? –

答えて

5

strcpyあなたはヌル終了文字のためのスペースを残して覚えて、それを自分で行う必要があり、あなたのためのメモリを割り当てません:

最初のケースで
char* url = new char[sup.length()+1]; 

または

char url[sup.length()+1]; 
//... 
strcpy(url, sup.c_str()); 

、に忘れてはいけません配列。 2番目のケースは、コンパイラがC99可変長配列を拡張子としてサポートしている場合にのみ機能します。

+0

ありがとう。それは今よく働く –

+1

それはうまくいくかもしれないが、これは私の意見では最善の答えではない。あなたはいつも他の人が何を言わなければならないのを待つことなく最初の答えを受け入れることに急いでいますか?私はこの答えが気に入らない理由は、C + +では、新しいと生の配列を使用することを避けるべきですが、ベクトルを使用することを好むべきです。 boost :: shared_array は本当に新しいものを使用しなければならないと感じたら別のオプションになります。 2番目のボディーは、それが任意のサイズを選ぶときに特に気に入っていません。実際に私は最初のブロックのために32が選ばれた理由も知らない。 – CashCow

+0

@CashCow Uh no。あなたの回答は、ブーストまたはベクトルを使用すると直感的でなく、(IMO)乱雑です。 – adelphus

1
char* url = new char[100]; 

まず、文字配列のメモリを割り当てる必要があります。

0

supからurlへのコピーは、urlの初期化を意味するものではありません。
urlを初期化することは、メモリを割り当てることを意味します。このように:

url = new char[size]; 
2

strcpyは、バッファオーバーフローが発生する可能性があるため安全ではありません。コピーするバイト数を正確に指定しているstrncpyを使用してください。あなたは、宛先バッファにメモリを割り当て、\0を末尾に追加する必要があります。

std::string strInsert("news"); 
std::string sup("http://www."); 
sup += strInsert + "yahoo.com"; 

char* url = new char[sup.length() + 1]; 
strncpy(url, sup.c_str(), sup.length()); 
url[sup.length()] = '\0'; 
// ... use url 
delete[] url; 
1

あなたが本当にSTDの内容からコピーされた文字の書き込み可能なバッファ::文字列が必要な場合は、std::vector<char>

を使用することができます

std::vector<char> urlAsVec(sup.c_str(), sup.c_str() + sup.size() + 1); 

あまりにもあなたのためにヌル・ターミネータを書き込みます:

std::vector<char> urlAsVec(sup.begin(), sup.end()); 
urlAsVec.push_back('\0'); 
char * url = &urlAsVec[0]; // pointer you can safely write to 

はまた、ベクターをこのように初期化することができます。

別の方法:あなたのベクトルが自動的にnull終端がsup.copy()がそれを書き込みませんが存在しますので、0にそのすべての要素を初期化することを

std::vector<char> urlAsVec(sup.size() + 1); 
sup.copy(&urlAsVec[0], sup.size()); 

注意。とにかくstrcpyの代わりにsup.copy(ptr, len)を使用することができます。これは、ヌルターミネータを手作業で書く必要がありますが、バッファサイズを指定できる点で(strncpyでも可能ですが)少し安全です。いくつかの固定値BUFLENため

char url[ BUFLEN ] = {0}; 
sup.copy(url, BUFLEN-1); 

あなたのバッファに書き込まれたソース文字列のコピーまたは一部のコピーを取得します:あなたはこれを使用している場合たとえば、

。私の初期化子は、すべての不文バイトが0

0
std::string sup = "news"; 
sup="http://www."+sup+"yahoo.com"; 
char* url = new char[sup.length()+1]; 
url = const_cast<char*>(sup.c_str()); 
url[sup.length()] = '\0'; 

std::cout<<url;   //http://www.newsyahoo.com 

お知らせURLの末尾に'\0'ある保証していることに注意してください。

3

私の意見では、これを行うには2つの方法があります。私は両方をテストしており、それらの両方が動作しているc_str()関数

string s = "hello"; 
const char *p; 
p = s.c_str(); 

を使用して&演算子は(アンパサンド)

string str = "hello"; 
char *p; 
p = &str[0]; 
  • を使用して

    1. 。もし私が間違っているなら、親切に私を修正してください。

  • +0

    テストするとうまくいくかもしれませんが、最初のものは少しハックされて動作することは保証されていません。例えば。文字列の内部表現が単一のメモリブロックの代わりにチャンクのリストであった場合、これを試しても文字列全体が出ないでしょう。したがって、c_str()は文字列にメモリの単一ブロックを作成させ、ゼロ終了させるために存在します。 – Bryan

    +0

    これは最適なソリューションです。 –

    関連する問題