【问题标题】:Using char and char[] in C++ [closed]在 C++ 中使用 char 和 char[] [关闭]
【发布时间】:2014-03-17 16:47:29
【问题描述】:

我在使用 char 类型时遇到问题。当我通过构造函数在结构中初始化 IDName 时,为什么会收到此错误消息? "expression must be a modifiable lvalue".

struct Staff
{
    char ID[8];
    char Name[30];
    Staff()
    {
        ID = "";
        Name = "";
    }
};

【问题讨论】:

  • 你在混合 C 和 C++
  • 这很糟糕,因为上面的代码也不能在 C 中工作,即使没有 c++ 类的东西。
  • 您不能将字符串文字分配给数组,您需要将字符复制进去。
  • @GHD 好吧,您可以随意使用您喜欢的任何语言。我们只需要知道在回答您的问题时应该采用哪种语言。 :)
  • @GIJoe。请不要大喊大叫。这不是一个拥挤的公交车站,这是一个很小的评论线程。

标签: c++ char


【解决方案1】:

由于这个问题被标记为 C++,并且代码仅使用 C++ 的特性(例如构造函数),我假设您在标题中错误地将 C 与 C++ 混淆了。

当你真正的意思是字符串时,不要使用char 数组。请改用std::string

struct Staff {
    std::string ID;
    std::string Name;
};

通过这种方式,默认构造函数将按预期运行,您甚至不需要指定它。您需要的唯一附加行是包含必要标题的行:

#include <string>

在文件的最顶部。

【讨论】:

  • 它是 C,所以你的答案现在已经过时了。 OP 已编辑。
  • @GIJoe,实际上它仍然不是 C(C 没有构造函数)。
  • 当然了,我只是想去掉它的标签。
  • @GIJoe,我有一种奇怪的感觉,OP 对 C 和 C++ 非常困惑。 :)
  • 哦,大声哭泣,OP 无法下定决心。我放弃。弃船
【解决方案2】:

char 在 C 和 C++ 中只是另一种数字类型,如 int,但更小(通常为一个字节)。字符数组并不特殊——它基本上是一块原始的内存。字符串文字在内部也是一个字符数组,但是 C++ 没有内置支持使用 operator= 复制数组——您必须自己复制字节,例如通过(不推荐使用的)strcpy C 函数(包括cstring)。

在C++中,处理字符串的常用方法是使用std::string(包括string),它是一个为你包装字符串字节的类,在干净的情况下实现字符串的复制、比较等,直观的时尚。

Staff 结构的末尾还缺少一个分号,这会导致一些有趣的编译错误 :-)

【讨论】:

    【解决方案3】:

    您不能更改IDName 的值,因为它是一个数组,而不是一个指针。

    要么将其声明为 char 指针(在这种情况下,最好将其声明为 const char*):

    const char *ID;
    const char *Name;
    

    或使用memset:

    memset(ID, '\0', sizeof(ID));
    memset(Name, '\0', sizeof(Name));
    

    这将“初始化”您的 char 数组。

    您可以使用strncpy 将字符串分配给数组

    strncpy(Name, "John Doe", sizeof(Name)-1);
    

    -1 代表空终止字符。

    【讨论】:

    • 谢谢你,我会在你的帮助下试试这个。
    【解决方案4】:

    你需要做的是

    struct Staff
    {
        char ID[8];
        char Name[30];
    
        Staff() :
            ID{0},  // Null terminate the array same as, ID[0] = 0;
            Name{0} // Null terminate the array same as, Name[0] = 0;
        {
        }
    };
    

    【讨论】:

    • 但没有构造函数,因为这应该是 C 代码
    • @jalf 感谢您指出这一点。我以为它是 C++。
    • 为什么我们必须声明 ID{0}、Name{0}?那代表什么。谢谢。
    • 在 C++ 中,这会将数组的所有值初始化为 0。
    • 所以我们不用再用这个来初始化它们了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2019-02-13
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    相关资源
    最近更新 更多