2012-11-08 223 views
64

我想将string转换为char数组,但不是char*。我知道如何将字符串转换为char*(通过使用malloc或我将其发布在我的代码中的方式) - 但这不是我想要的。我只是想将string转换为char[size]数组。可能吗?如何将字符串转换为C++中的字符数组?

#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; 
} 
+11

这似乎是C++,不C. –

+0

@FredLarson:OK,编辑,谢谢 –

+3

可能重复的[std :: string到char \ *](http://stackoverflow.com/questions/7352099/stdstring-to-char) – cegprakash

回答

87
我能想到这样做的

简单的方法是:

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; 
+9

'strncpy'的捕获是它不会null-terminated如果它在源字符串中找到空值之前达到大小。一定要小心! –

+0

@FredLarson - 好点!值得放'tab2 [sizeof(tab2) - 1] = 0;'在它之后,然后呢? – Chowlett

+1

是的,我认为这是一个合理的方式来处理它。 –

6

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

4

尝试的strcpy(),但弗来德说,这是C++,不是C

2

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

strcpy(tab2, tmp.c_str()); 

注意缓冲区溢出。做

15

最简单的方式,它会是这样

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

数组大小在C++中必须是编译时常量。 – interjay

+3

与C++ 11 –

7
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 ::复制应该不是strcpy的选择

32

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

  1. 一个恒定的字符数组是配不上你,让你一起去,

    const char *array = tmp.c_str(); 
    
  2. 或者你需要修改 char数组所以常是不正常,则只要进入与此

    char *array = &tmp[0]; 
    

他们都是只是作业和大多数时候,这正是你需要的,如果你真的需要一个新的副本,然后跟随其他人的答案。

+3

作品他想要一个字符数组,而不是他创造了一个char * – harogaston

+2

指针是同样的事情,作为一个字符数组。 C和C++中的数组变量只是指向数组中第一个元素的指针。 –

1

如果你不知道字符串的大小事先,它可以变化很大,你可以得到一个动态分配的固定大小的数组与unique_ptr阵列过载:

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

请注意,你不这里需要strncpy,因为首先分配的数组足够大。

4

试试这种方式它应该是工作。

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

嗯,我知道这可能是愚蠢的,而不是简单,但我认为它应该工作:

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

呃,不是真的。你只是假设''n''不能大于''b''。如果“n> b”,它会崩溃。最好使用已经提供的''strcpy''函数。 编辑:在某些情况下,使用''strcpy_s''可能会更好,因为它会检查NULL指针(如果您的平台支持它) – droidballoon

相关问题