如何在C ++中将字符串转换为char数组?


103

我想转换stringchararray但不能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;
}

12
这似乎是C ++,不C.
佛瑞德拉尔森

@FredLarson:好的,编辑过,谢谢
Brian Brown

Answers:


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结尾。也一定要小心!
弗雷德·拉森

1
是的,我认为这是处理此问题的合理方法。
弗雷德·拉尔森

1
strncpy是出于安全考虑,因为strncpy不会溢出您提供的缓冲区。C99中也没有strcpy_s,但是C11中最近添加了它。
bames53

6
我喜欢人们滥用安全一词的方式...哦,字符串没有足够的空间,所以我们将其截短..哦,我们不小心删除了有关患者生命危险的药物过敏的信息..但我们没有缓冲区溢出。好吧,我这很安全 ……
Karoly Horvath

4
@KarolyHorvath-不同领域的安全性。显然,您需要检查功能要求和“不做愚蠢的事情”。但是,如果超出缓冲区,您将无法保证知道会发生什么。正确的编码可确保程序在操作系统上“安全”运行。正确的思考可确保程序在执行用户所需的操作时是“安全的”。
Chowlett 2015年

58

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

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

    const char *array = tmp.c_str();
  2. 或者,您需要修改 char数组,使常量不正确,然后就可以了

    char *array = &tmp[0];

两者都是作业,大多数时间正是您所需要的,如果您确实需要新的副本,请遵循其他同事的答案。


7
他想要一个字符数组,而不是一个字符*
harogaston

10
他创建的指针与char数组相同。C和C ++中的数组变量只是指向数组中第一个元素的指针。
JustinCB

@ JustinC.B。并不是的!数组变量可能会衰减为指针,但在C ++中它们并不相同。例如,std::size(elem)在C ++中,当elemis为a 时定义良好,char array但是当elemis为char*or 时它无法编译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,因此应该选择std :: string :: copy而不是strcpy



5

尝试这种方式应该可以。

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

4

尝试strcpy(),但是正如Fred所说,这是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>b。最好使用strcpy已经提供的功能。编辑:在某些情况下,使用它可能会更好,strcpy_s因为它添加了对NULL指针的检查(如果您的平台支持它)
droidballoon

0

如果您使用的是C ++ 11或更高版本,建议您使用std::snprintfover 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());
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.