gpt4 book ai didi

c++ - 将字符串分配给 char 数组

转载 作者:太空宇宙 更新时间:2023-11-04 15:42:50 24 4
gpt4 key购买 nike

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

案例一:

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 - 参见 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”)字符串文字复制到该可写缓冲区中。如果您只想跟踪文本(例如,它是“apple”而不是说“orange”,稍后可能会复制到 s1)而不需要进一步修改文本,您可以使用 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];,您可以:

s1[0] = std::toupper(s1[0]);       // ok

关于c++ - 将字符串分配给 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20778222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com