web-dev-qa-db-ja.com

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

stringchar配列に変換したいがchar*には変換したくない。文字列をchar*に変換する方法を知っています(mallocまたは私のコードでそれをポストした方法を使用することによって) - しかしそれは私が望むものではありません。単にstringchar[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;
}
85
Brian Brown

私が考えることができる最も簡単な方法は、次のとおりです。

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());
107
Chowlett

わかりました、今は私の番です。 2つの場合があります。

  1. 定数のchar配列 はあなたにとって十分なので、あなたは

    const char *array = tmp.c_str();
    
  2. または - 変更する必要があります 定数が適切ではないため、char配列を変更してください。

    char *array = &tmp[0];
    

両方とも 単なる代入操作 そしてほとんどの場合それがまさにあなたが必要としているものです。もしあなたが本当に新しいコピーが必要なら、他の仲間の答えに従ってください。

50
rad

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

std::string myWord = "myWord";
char myArray[myWord.size()+1];//as 1 char space for null is also required
strcpy(myArray, myWord.c_str());
15
user2963410
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を選択する必要があります。

9
Youka

strcpyを使って文字列を配列にコピーするだけです。

6
David Schwartz

これでうまくいくはずです。

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

Strcpy()を試してみてください。Fredが言ったように、これはC++ではなくC++です。

4
Marrow Gnawer

strcpy()を使うことができます。

strcpy(tab2, tmp.c_str());

バッファオーバーフローに注意してください。

2
Fred Larson

文字列のサイズが事前にわからず、大きく変わる可能性がある場合は、配列オーバーロードがunique_ptrの動的に割り当てられた固定サイズの配列を取得できます。

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

最初は配列が十分に大きくなるように割り当てられているため、ここではstrncpyは必要ありません。

1
emlai

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

#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());
0
luizfls

まあ私はこれが多分むしろ馬鹿げたことを知っている より 簡単ですが、うまくいくはずです。

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