C++ 将字符串分配给char数组
我对字符串初始化感到困惑。 我认为: 案例1:C++ 将字符串分配给char数组,c++,string,C++,String,我对字符串初始化感到困惑。 我认为: 案例1: char s1[100] = { "apple" }; 案例2: char s1[100]; s1 = "apple"; case1编译正常,但是case2得到错误。 编译器说我正在尝试将char[5]分配给char[100]。。。 您能澄清两种情况之间的区别吗?当前代码的解释 案例1是初始化s1的合法方式,其中“a”进入[0],“p”进入[1]和[2],“l”进入[3],“e”进入[4],其余设置为0(ASCII NUL-参见) < P>强>
char s1[100] = { "apple" };
案例2:
char s1[100];
s1 = "apple";
case1编译正常,但是case2得到错误。
编译器说我正在尝试将char[5]分配给char[100]。。。
您能澄清两种情况之间的区别吗?当前代码的解释
案例1是初始化s1
的合法方式,其中“a”进入[0],“p”进入[1]和[2],“l”进入[3],“e”进入[4],其余设置为0(ASCII NUL-参见)
< P>强>案例2 <强>尝试将一个数组分配给另一个(根据消息的大小不同),这在C++中是不合法的。您应该使用strcpy(s1,“apple”)来实现这一点,尽管它在行为上略有不同:它只会将s1[5]
设置为0/NUL,而[6]
以后的值不受影响(如果s1
位于堆栈或堆上,它们将是未初始化的,并且从它们读取将是未定义的行为)。从[6]
开始初始化s1
后,您想用它做的大多数事情都不会受益
直观的选择:`std::string`
也许最好的方法是切换到std::string
,这更直观(您必须在程序顶部包含)。不过,案例1的语法略有不同:要么std::string s1=“apple”代码>,或者-如果您有C++11编译器-std::strings1{“apple”}代码>
可写缓冲区与字符串文本指针
还请注意,在您的问题中,chars1[100]
创建了一个包含100个字符的数组,您可以对其进行读写,然后将只读(“const”)字符串文本复制到该可写缓冲区中。如果您只想跟踪文本(例如,它是“apple”而不是“orange”,以后可能会复制到s1
中),而不需要进一步修改文本,您可以使用const char*
来存储字符串文本的地址:
const char* p_s1 = "apple";
if (f()) p_s1 = "orange";
std::cout << "go eat an " << p_s1 << '\n';
而如果你坚持使用chars1[100]代码>您可以执行以下操作:
s1[0] = std::toupper(s1[0]); // ok
现行守则的解释
案例1是初始化s1
的合法方式,其中“a”进入[0],“p”进入[1]和[2],“l”进入[3],“e”进入[4],其余设置为0(ASCII NUL-参见)
< P>强>案例2 <强>尝试将一个数组分配给另一个(根据消息的大小不同),这在C++中是不合法的。您应该使用strcpy(s1,“apple”)
来实现这一点,尽管它在行为上略有不同:它只会将s1[5]
设置为0/NUL,而[6]
以后的值不受影响(如果s1
位于堆栈或堆上,它们将是未初始化的,并且从它们读取将是未定义的行为)。从[6]
开始初始化s1
后,您想用它做的大多数事情都不会受益
直观的选择:`std::string`
也许最好的方法是切换到std::string
,这更直观(您必须在程序顶部包含)。不过,案例1的语法略有不同:要么std::string s1=“apple”代码>,或者-如果您有C++11编译器-std::strings1{“apple”}代码>
可写缓冲区与字符串文本指针
还请注意,在您的问题中,chars1[100]
创建了一个包含100个字符的数组,您可以对其进行读写,然后将只读(“const”)字符串文本复制到该可写缓冲区中。如果您只想跟踪文本(例如,它是“apple”而不是“orange”,以后可能会复制到s1
中),而不需要进一步修改文本,您可以使用const char*
来存储字符串文本的地址:
const char* p_s1 = "apple";
if (f()) p_s1 = "orange";
std::cout << "go eat an " << p_s1 << '\n';
而如果你坚持使用chars1[100]代码>您可以执行以下操作:
s1[0] = std::toupper(s1[0]); // ok
内置数组(所谓的原始数组)不支持直接赋值
您的案例1不是分配:它是初始化
标准库提供了std::array
,它基本上将原始数组封装在结构中,因此是可分配的
然而,出于代码的明显目的,数组将是错误的选择
而是使用一个std::string,它支持从字符串文本初始化和赋值
示例(包括
):
内置数组(所谓的原始数组)不支持直接赋值
您的案例1不是分配:它是初始化
标准库提供了std::array
,它基本上将原始数组封装在结构中,因此是可分配的
然而,出于代码的明显目的,数组将是错误的选择
而是使用一个std::string,它支持从字符串文本初始化和赋值
示例(包括
):
那么,“不同大小的”,相同大小数组的直接赋值也是无效的;(没有支架)?奇怪的是,编译器没有抱怨。@Peter:那是初始化,不是赋值。我以为赋值和初始化是一样的,但事实并非如此。谢谢大家!@Peter:一般来说,初始化是将以前未初始化的内存设置为该类型变量的有效状态所发生的事情-编译器可能会利用OS可执行加载程序在清除某些内存区域方面的行为知识来编排该状态,或者对可执行映像中的可立即使用的值进行错误处理,或者可能涉及数据的运行时设置或构造函数调用。然后程序就可以使用该变量,如果它离开作用域,则保证调用它的析构函数等。。赋值修改这样一个预先存在的对象。好吧,“大小不同”,直接赋值相同大小的数组是不正确的