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

Posted

技术标签:

【中文标题】如何在 C++ 中将字符串转换为 char 数组?【英文标题】:How to convert string to char array in C++? 【发布时间】:2012-10-28 22:42:30 【问题描述】:

我想将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;

【问题讨论】:

这似乎是 C++,而不是 C。 @FredLarson:好的,已编辑,谢谢 std::string to char*的可能重复 【参考方案1】:

只需将字符串复制到带有strcpy 的数组中即可。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

strncpy 的问题是,如果它在源字符串中找到空值之前达到大小,它不会空值终止。这点也要小心! 是的,我认为这是一种合理的处理方式。 strncpy 是为了安全,因为 strncpy 不会超出你给它的缓冲区。 strcpy_s 也不在 C99 中,但最近在 C11 中添加。 我喜欢人们滥用safety这个词的方式......哦,没有足够的空间容纳字符串,所以让我们截断它......哦,我们不小心删除了信息关于患者的危及生命的药物过敏......但我们不再有缓冲区溢出。好吧,我它是安全... @KarolyHorvath - 不同领域的安全性。显然,您需要检查您的功能需求并且不要做愚蠢的事情。但是,如果您超出缓冲区,您将失去任何知道会发生什么的保证。正确的编码可确保程序在您的操作系统上“安全”运行。正确的思考可确保程序“安全”地执行用户需要的操作。【参考方案4】:

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

strcpy(tab2, tmp.c_str());

注意缓冲区溢出。

【讨论】:

【参考方案5】:

最简单的方法是这样

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

【讨论】:

数组大小必须是 C++ 中的编译时常量。 @PhaniRithvij 这是错误的,除非您只针对允许将其作为语言扩展的编译器,在这种情况下它仍然是不好的做法。【参考方案6】:
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

【讨论】:

【参考方案7】:

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

    常量字符数组对你来说已经足够好了,所以你可以使用,

    const char *array = tmp.c_str();
    

    或者你需要修改 char 数组所以常量不行,那么就用这个

    char *array = &tmp[0];
    

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

【讨论】:

他想要一个 char 数组,而不是 char * 他创建的指针和char数组一样。 C 和 C++ 中的数组变量只是指向数组中第一个元素的指针。 @JustinC.B.并不真地!数组变量可能衰减为指针,但它们在 C++ 中不同。例如当elemchar array 时,C++ 中的std::size(elem) 定义明确,但当elemchar*const char* 时编译失败,您可以在here 看到它 如果 tmp 是堆栈分配的并且超出范围但数组的生命周期更长,#2 会导致问题(悬空指针)吗?【参考方案8】:

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

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

【讨论】:

【参考方案9】:

试试这个方法应该可以的。

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

【讨论】:

【参考方案10】:

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

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&gt;b 会崩溃。最好使用已经提供的strcpy 函数。编辑:在某些情况下,使用 strcpy_s 可能会更好,因为它添加了对 NULL 指针的检查(如果您的平台支持它)【参考方案11】:

如果您使用的是 C++11 或更高版本,我建议您使用 std::snprintf 而不是 std::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());

【讨论】:

以上是关于如何在 C++ 中将字符串转换为 char 数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将字符串转换为 const char[]

在 MFC C++ 中将 char 数组转换为 UNICODE

c++中如何将一个字符串转化成数组

在 C++ 中将 unsigned char (byte) 数组转换为 unsigned short

如何在 C++ 中将 char 值显示为字符串?

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