Как преобразовать строку в массив char в С++?

Я хотел бы преобразовать массив string в char, но не char*. Я знаю, как преобразовать строку в 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;
}

Ответ 1

Самый простой способ сделать это:

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

Ответ 2

Хорошо, я шокирован тем, что никто не дал хороший ответ, теперь моя очередь. Есть два случая:

  • A константа char массив достаточно хорош для вас, поэтому вы идете,

    const char *array = tmp.c_str();
    
  • Или вам нужно изменить массив char, так что константа не в порядке, а затем просто перейдите к этому

    char *array = &tmp[0];
    

Оба из них - это просто операции присваивания, и большую часть времени это именно то, что вам нужно, если вам действительно нужна новая копия, а затем следуйте другим ребятам.

Ответ 3

Самый простой способ сделать это - это

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

Ответ 4

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 в С++, поэтому std::string:: copy должен быть выбран вместо strcpy.

Ответ 5

Просто скопируйте строку в массив с помощью strcpy.

Ответ 6

Попробуй так, как надо работать.

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

Ответ 7

Попробуйте strcpy(), но, как сказал Фред, это С++, а не C

Ответ 8

Вы можете использовать strcpy(), например:

strcpy(tab2, tmp.c_str());

Следите за переполнением буфера.

Ответ 9

Если вы заранее не знаете размер строки и можете сильно различаться, вы можете получить динамически распределенный массив фиксированного размера с перегрузкой массива unique_ptr:

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

Обратите внимание, что здесь вам не нужен strncpy, так как массив выделяется как достаточно большой.

Ответ 10

Ну, я знаю, это может быть довольно глупое , чем и простое, но я думаю, что он должен работать:

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

Ответ 11

Если вы используете С++ 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());

В С++ 17 у вас есть такая альтернатива:

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

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