124

我想转换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;
}
4

11 回答 11

155

我能想到的最简单的方法是:

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());
于 2012-11-08T17:11:34.327 回答
71

好的,我很震惊没有人真正给出一个好的答案,现在轮到我了。有两种情况;

  1. 一个常量 char 数组对你来说已经足够好了,所以你可以使用,

    const char *array = tmp.c_str();
    
  2. 或者你需要修改char 数组,所以常量不行,然后就用这个

    char *array = &tmp[0];
    

它们都只是分配操作,大多数时候这正是您所需要的,如果您真的需要一个新副本,那么请关注其他伙伴的答案。

于 2015-03-05T07:55:20.500 回答
18
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 是一种更好的做法,因此应该选择std::string::copy而不是strcpy

于 2014-12-27T02:46:43.550 回答
16

最简单的方法是这样

std::string myWord = "myWord";
char myArray[myWord.size()+1];//as 1 char space for null is also required
strcpy(myArray, myWord.c_str());
于 2014-01-10T16:12:15.733 回答
6

只需将字符串复制到数组中strcpy

于 2012-11-08T17:11:02.023 回答
5

尝试这种方式应该可以工作。

string line="hello world";
char * data = new char[line.size() + 1];
copy(line.begin(), line.end(), data);
data[line.size()] = '\0'; 
于 2015-10-19T11:47:04.487 回答
4

试试 strcpy(),但正如 Fred 所说,这是 C++,而不是 C

于 2012-11-08T17:11:27.640 回答
2

你可以strcpy()像这样使用:

strcpy(tab2, tmp.c_str());

注意缓冲区溢出。

于 2012-11-08T17:12:25.540 回答
2

如果事先不知道字符串的大小,可以动态分配数组:

auto tab2 = std::make_unique<char[]>(temp.size() + 1);
std::strcpy(tab2.get(), temp.c_str());
于 2015-10-10T08:55:58.850 回答
0

如果您使用的是 C++11 或更高版本,我建议您使用std::snprintfoverstd::strcpystd::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());
于 2019-08-25T04:48:07.180 回答
-1

好吧,我知道这可能比简单而且愚蠢,但是我认为它应该可以工作:

string n;
cin>> n;
char b[200];
for (int i = 0; i < sizeof(n); i++)
{
    b[i] = n[i];
    cout<< b[i]<< " ";
}
于 2016-04-02T16:14:28.077 回答