C ++で文字列を文字配列に変換する方法は?


103

配列に変換stringしたいのですcharchar*。文字列をchar*mallocコードを使用して、またはコードに投稿する方法で)に変換する方法を知っていますが、それは私が望んでいることではありません。単に配列に変換stringしたいだけですchar[size]。出来ますか?

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

int main()
{
    // char to string
    char tab[4];
    tab[0] = 'c';
    tab[1] = 'a';
    tab[2] = 't';
    tab[3] = '\0';
    string tmp(tab);
    cout << tmp << "\n";

    // string to char* - but thats not what I want

    char *c = const_cast<char*>(tmp.c_str());
    cout << c << "\n";

    //string to char
    char tab2[1024];
    // ?

    return 0;
}

12
これはCではなくC ++のようです
Fred Larson

@FredLarson:わかりました、編集、ありがとう
ブライアンブラウン

回答:


123

私がそれをすることを考えることができる最も簡単な方法は:

string temp = "cat";
char tab2[1024];
strcpy(tab2, temp.c_str());

安全のために、あなたは好むかもしれません:

string temp = "cat";
char tab2[1024];
strncpy(tab2, temp.c_str(), sizeof(tab2));
tab2[sizeof(tab2) - 1] = 0;

またはこのようにすることができます:

string temp = "cat";
char * tab2 = new char [temp.length()+1];
strcpy (tab2, temp.c_str());

9
キャッチstrncpyは、ソース文字列でnullを見つける前にサイズに達してもnullで終了しないことです。それに気を付けてください!
Fred Larson、

1
はい、それはそれを扱う合理的な方法だと思います。
Fred Larson

1
strncpyは安全のためです。strncpyは指定されたバッファをオーバーランさせません。また、strcpy_sはC99にはありませんが、最近C11に追加されました。
bames53

6
安全という言葉を乱用する方法が好きです...ああ、ひものための十分なスペースがないので、切り詰めましょう...ああ、私たちは誤って患者の生命を脅かす薬物アレルギーに関する情報を削除しましたが、私たちは持っていません。バッファオーバーランはもうありません。まあ、それは安全だと思います ...
Karoly Horvath

4
@KarolyHorvath-異なるドメインでの安全性。明らかに、あなたはあなたの機能要件をチェックし、愚かなことをしない必要があります。しかし、バッファをオーバーランすると、何が起こるかを知る保証がなくなります。正しいコーディングにより、プログラムがOSで実行しても安全です。正しい考え方は、プログラムがユーザーの必要なことを実行する上で「安全」であることを保証します。
Chowlett、2015年

58

さて、今度は誰も本当に良い答えを出してくれなかったのでショックです。2つのケースがあります。

  1. 一定のchar配列は、あなたが一緒に行くので、あなたのために良い十分です

    const char *array = tmp.c_str();
  2. または、char配列を変更して定数が正しくないようにする必要があります。

    char *array = &tmp[0];

どちらも単なる割り当て操作であり、ほとんどの場合それだけで十分です。新しいコピーが本当に必要な場合は、他のフェローの回答に従ってください。


7
彼はcharではなくchar配列を望んでいます*
harogaston

10
彼が作成したポインターは、char配列と同じです。CおよびC ++の配列変数は、配列の最初の要素への単なるポインタです。
JustinCB 2017年

@ JustinC.B。あんまり!配列変数ポインタに分解される可能性がありますが、C ++では同じではありません。たとえばstd::size(elem)、C ++ではelem、aの場合は明確に定義されchar arrayていますelemが、a char*またはの場合はコンパイルに失敗します。ここでconst char*確認できます
aniliitb10

16

それを行う最も簡単な方法はこれでしょう

std::string myWord = "myWord";
char myArray[myWord.size()+1];//as 1 char space for null is also required
strcpy(myArray, myWord.c_str());

14
配列サイズは、C ++ではコンパイル時の定数でなければなりません。
interjay 2014年

12
str.copy(cstr, str.length()+1); // since C++11
cstr[str.copy(cstr, str.length())] = '\0';  // before C++11
cstr[str.copy(cstr, sizeof(cstr)-1)] = '\0';  // before C++11 (safe)

C ++でCを使用しないほうがよいので、strcpyではなくstd :: string :: copyを選択する必要があります。



5

うまくいくはずです。

string line="hello world";
char * data = new char[line.size() + 1];
copy(line.begin(), line.end(), data);
data[line.size()] = '\0'; 

4

strcpy()を試してください。ただし、フレッドが言ったように、これはC ++ではなくCです。



2

文字列のサイズが事前にわからない場合は、配列を動的に割り当てることができます。

auto tab2 = std::make_unique<char[]>(temp.size() + 1);
std::strcpy(tab2.get(), temp.c_str());

0

まあ、これは多分単純でないかもしれませんが、うまくいくはずです。

string n;
cin>> n;
char b[200];
for (int i = 0; i < sizeof(n); i++)
{
    b[i] = n[i];
    cout<< b[i]<< " ";
}

まあ、そうでもない。あなたはnそれがを超えることはできないと仮定しているだけですb。場合クラッシュしますn>bstrcpyすでに提供されている機能を使用する方がよい。編集:場合によってstrcpy_sは、NULLポインターのチェックが追加されるため、使用する方が良い場合があります(プラットフォームでサポートされている場合)
droidballoon

0

C ++ 11以上を使用std::snprintfしているstd::strcpy場合std::strncpyは、その安全性のため(つまり、バッファーに書き込むことができる文字数を決定するため)、および文字列をnullで終了させるため(つまり、心配する必要はありません)。それは次のようになります:

#include <string>
#include <cstdio>

std::string tmp = "cat";
char tab2[1024];
std::snprintf(tab2, sizeof(tab2), "%s", tmp.c_str());

C ++ 17では、この代替手段があります。

#include <string>
#include <cstdio>
#include <iterator>

std::string tmp = "cat";
char tab2[1024];
std::snprintf(tab2, std::size(tab2), "%s", tmp.c_str());
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.