【问题标题】:Why I can't change char array attribute of a struct? [duplicate]为什么我不能更改结构的 char 数组属性? [复制]
【发布时间】:2014-02-08 10:42:58
【问题描述】:

这个问题很简单,但我很困惑为什么结构的行为是这样的,因为它的所有成员默认都是public,看看下面的代码

struct Student
{
   char name[20];
}
int main()
{
   Student s;
   s.name="ahmed";
}

此代码给出了一个错误,即名称应该是一个可修改的左值。

但是如果我通过char在循环char中赋值,那么它就像这样工作正常

s.name[0]='a';//works fine

【问题讨论】:

  • 编译器已经给出了anwser。 “名称应该是一个可修改的左值”。
  • 你应该查看 std::string 来存储名称,使用起来更容易。
  • Student a={"ahmed"}; s=a; 效果更好,但这可能会让你更加困惑......

标签: c++ string struct arrays


【解决方案1】:

C 中的数组是不可赋值和不可复制初始化的,而在 C++ 中这种行为是继承的。在右侧数组衰减为指针,但在您的情况下,您的复制初始化是不允许的。

如果你试试这个:

{
   char name[20];
   name="ahmed";
}

您实际上是在复制初始化数组 - 这是不允许的

唯一的例外是用字符串初始化它们

 char c[] = "abc";

在您的情况下,您应该使用名为 strcpy 的函数来完成此操作:

{
   char name[20];
   strcpy(&name[0],"ahmed"); // Obviously make sure that there's enough space
}

【讨论】:

  • 为什么这段代码可以正常工作并显示 ahmed?字符名称[50]="艾哈迈德"; std::cout
  • @Ahmed 因为这是一个初始化。它几乎等同于char name[] = {'a','h','m','e','d'};
  • 谢谢 :) 很久没用C++了,遇到了一些困难
  • @mb84 你忘了终止'\0'
  • 你写的那一行“错误”是你的错误解释。衰减只发生在右手边。
【解决方案2】:

值得注意的是,你也可以使用字符串来完成这个任务:

#include<iostream>
#include<string>
using namespace std;

struct Student{
   string name;
};

int main()
{
   Student s;
   s.name = "ahmed";
}

【讨论】:

  • 当然我知道我可以用字符串做到这一点。我只是想知道为什么 char[] 会这样
【解决方案3】:

在您的情况下,结构不是问题。 C 中的数组不可赋值。

使用 strcpy(s.name,"ahmed") 代替 s.name = "ahmed"

【讨论】:

    【解决方案4】:

    name 是一个数组,不能分配给数组名。相反,您应该在cstring 中使用std::strcpy 来复制C 样式字符串的内容。

    std::strcpy(s.name, "ahmed");
    

    请注意,问题与namestruct 的一部分这一事实无关。对于原生 char 数组,您也会遇到同样的问题。

    【讨论】:

    • (+1) 值得补充的是,这与 namestruct 的一部分无关。
    • @NPE 建议采纳,添加注释。
    【解决方案5】:

    你必须使用:

    struct Student
    {
       char *name;
    };
    
    int main()
    {
       Student s;
       s.name = "ahmed";
       return 0;
    }
    

    【讨论】:

    • 不是和我的代码一样吗? name 在这两种情况下都是一个 char 指针
    • 并非如此。 namechar name[20] 仅位于 char * 类型的赋值的右侧。左侧不允许出现,除了用于初始化(第一次)。
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 2020-07-20
    • 2012-02-10
    • 2021-03-28
    • 2012-03-27
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    相关资源
    最近更新 更多