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

Bri*_*own 89 c++ string type-conversion

我想转换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;
}
Run Code Online (Sandbox Code Playgroud)

Cho*_*ett 113

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

string temp = "cat";
char tab2[1024];
strcpy(tab2, temp.c_str());
Run Code Online (Sandbox Code Playgroud)

为安全起见,您可能更喜欢:

string temp = "cat";
char tab2[1024];
strncpy(tab2, temp.c_str(), sizeof(tab2));
tab2[sizeof(tab2) - 1] = 0;
Run Code Online (Sandbox Code Playgroud)

或者可以这种方式:

string temp = "cat";
char * tab2 = new char [temp.length()+1];
strcpy (tab2, temp.c_str());
Run Code Online (Sandbox Code Playgroud)

  • 使用`strncpy`的问题是,如果它在源字符串中找到null之前达到大小,则不会为null终止.也要小心! (9认同)
  • 我喜欢人们滥用*安全*这个词的方式...哦,没有足够的空间容纳字符串,所以让我们截断它......哦,我们不小心删除了有关病人生命危险药物过敏的信息......但我们不知道t再次出现缓冲区溢出.好吧,我猜*它是*安全*... (5认同)
  • @KarolyHorvath - 不同领域的安全性.显然,您需要检查您的功能要求和不做蠢事.但是,如果你超出缓冲区,你将无法保证知道会发生什么.正确的编码可确保程序在您的操作系统上"安全"运行.正确_thinking_确保程序在执行用户需要时"安全". (3认同)

小智 52

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

  1. 一个常量字符数组对你来说足够好,所以你去,

    const char *array = tmp.c_str();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者您需要修改 char数组,因此常量不正常,然后再使用它

    char *array = &tmp[0];
    
    Run Code Online (Sandbox Code Playgroud)

它们都只是作业操作,大部分时间都是你需要的,如果你真的需要一个新的副本,那么请跟随其他研究员的答案.

  • 他创建的指针与char数组相同.C和C++中的数组变量只是指向数组中第一个元素的指针. (9认同)
  • 他想要一个char数组,而不是char* (7认同)
  • @贾斯汀C.B. 并不真地!数组变量**可能会衰减**为指针,但它们在 C++ 中并不相同。例如,当`elem` 是一个`char 数组` 时,C++ 中的`std::size(elem)` 被很好地定义,但是当`elem` 是一个`char*` 或`const char*` 时它无法编译,你可以看到它在[这里](https://coliru.stacked-crooked.com/a/199ae9f32a48dcc7) (4认同)

小智 16

最简单的方法是做到这一点

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

  • 数组大小必须是C++中的编译时常量. (11认同)
  • 适用于C++ 11 (5认同)

You*_*uka 10

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)
Run Code Online (Sandbox Code Playgroud)

在C++中避免使用C是一种更好的做法,因此应该选择std :: string :: copy而不是strcpy.


Dav*_*rtz 6

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


小智 5

尝试这种方式应该是有效的.

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