如何在 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++ 中不同。例如当elem
是char array
时,C++ 中的std::size(elem)
定义明确,但当elem
是char*
或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>b
会崩溃。最好使用已经提供的strcpy
函数。编辑:在某些情况下,使用 strcpy_s
可能会更好,因为它添加了对 NULL 指针的检查(如果您的平台支持它)【参考方案11】:
如果您使用的是 C++11 或更高版本,我建议您使用 std::snprintf
而不是 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());
【讨论】:
以上是关于如何在 C++ 中将字符串转换为 char 数组?的主要内容,如果未能解决你的问题,请参考以下文章
在 MFC C++ 中将 char 数组转换为 UNICODE