将字符串分配给char数组

时间:2013-12-26 01:35:52

标签: c++ string

我对字符串初始化感到困惑。 我相信以下几点:

情形1:

char s1[100] = { "apple" };

情况2:

char s1[100];
s1 = "apple";

case1编译好,但是,case2得到错误。 编译器说我试图将char [5]分配给char [100] ... 你能澄清两种情况之间的区别吗?

2 个答案:

答案 0 :(得分:3)

当前代码的说明

案例1 是初始化s1的合法方式,其中'a'进入[0],'p'进入[1]和[2],'l'进入[3],'e'到[4],其余设为0(ASCII NUL - 见http://en.wikipedia.org/wiki/ASCII)。

案例2 尝试将一个数组分配给另一个数组(根据消息的大小不同),这在C ++中是不合法的。您应该使用strcpy(s1, "apple")执行此操作,但行为稍有不同:它只会将s1[5]设置为0 / NUL,[6]以后不受影响(如果s1处于启用状态堆栈或堆,它们将被取消初始化并从中读取它们将是未定义的行为)。您想要使用s1做的大多数事情都不会从[6]的初始化中受益....

一个直观的选择:`std :: string`

也许最好的方法是切换到std::string,它更直观地工作(你必须#include <string>在你的程序上面)。案例1的语法虽然略有不同:std::string s1 = "apple";,或者 - 如果你有一个C ++ 11编译器 - std::string s1 { "apple" };

可写缓冲区与字符串文字指针

另请注意,在您的问题中,char s1[100]创建了一个可以读取和写入的100个字符的数组,然后您将从只读(“const”)字符串文字复制到该可写字符串中缓冲。如果您只是想跟踪文本(例如它是“苹果”而不是说“橙色”,可能会在以后复制到s1)而无需进一步修改文本,则可以使用{{ 1}}存储字符串文字的地址:

const char*

作为字符串文字的const char* p_s1 = "apple"; if (f()) p_s1 = "orange"; std::cout << "go eat an " << p_s1 << '\n'; 性质的示例,使用上面的const,您无法修改指向的字符串文字,如:

const char* p_s1

然而,如果你坚持使用#include <cctype> ... p_s1[0] = std::toupper(p_s1[0]); // oops! p_s1[0] inside string literal - mustn't write ,你可以这样做:

char s1[100];

答案 1 :(得分:3)

buit-in数组(所谓的原始数组)不支持直接赋值。

您的案例1不是作业:它是初始化。

标准库提供std::array,它基本上将原始数组包装在struct中,因此可以赋值。

但是,出于代码的明显目的,数组将是错误的选择。

而是使用 std::string ,它支持字符串文字的初始化和分配。


示例(包括<string>):

using std::string;
string s1 = "apple";
string s2;

s2 = apple;