错误:表达式必须是可修改的左值

时间:2014-08-19 10:26:01

标签: c++ struct

我收到了一个错误:

  

表达式必须是行obj.name = ptr->name

的可修改左值

我试图让 obj 数组类型对象一样

 for(int j=0 ;j<1;j++)
{
obj[j].id = ptr->id;
obj[j].balance= ptr->balance;
obj[j].name = ptr->name;   //still getting error here.
obj[j].nic = ptr->nic;
}
return(obj);
}

但这也没有奏效。

如果我将错误评论出来并仅传递三个剩余值,它应该可以工作但我在第一次输出后收到垃圾值。

这是原始代码:

#include<iostream>
using namespace std;

struct bank
{
  int id, nic;
  float balance;
  char name[20];


};
bank search(bank* );

void main()

{

    bank data[2],mobj;
    for(int i=0;i<2;i++)
    {
    cout<<"enter name: ";
    cin>>data[i].name;
    cout<<"enter id: ";
    cin>>data[i].id;
    cout<<"enter balance : ";
    cin>>data[i].balance;
    cout<<"enter nic : ";
    cin>>data[i].nic;

    }


    mobj=search(data);

    cout <<"balance of customer no. "<<mobj.balance<<endl;
    cout<<"id is" <<mobj.id<<endl;
    cout<< "nic is"<<mobj.nic<<endl;



    system("pause");
}




bank search(bank *ptr)
{   
    int id;
    cout<<"enter value you want to serch"<<endl;
    cin>>id;
    bank obj;
for(int i=0 ; i<2 ;i++)
{
    if(ptr->id == id)
    {
        break;
    }
    ptr++;
}

obj.id = ptr->id;
obj.balance= ptr->balance;
obj.name = ptr->name;    //error in this line(obj must be modifiable value)
obj.nic = ptr->nic;

return(obj);
}

请视情况提供帮助!

3 个答案:

答案 0 :(得分:2)

obj.namechar的数组。您无法在阵列上进行分配。所以,如果你想坚持阵列:

  1. 请参阅c++ array assignment of multiple values
  2. 使用strcpy(obj.name, ptr->name);
  3. 但我建议转换为std::string ...它比数组更容易使用,在我看来,您打算使用obj.name作为字符串。所以得到了正确的字符串。

答案 1 :(得分:1)

您的选择是:

  • name作为std::string。然后它会起作用
  • 使用strcpy( obj.name, ptr->name );

如果您的代码是C ++,那么第一个代码具有更多的优势,当您使用cin读取它时,它将自动确保缓冲区足够大,以便用户输入。

现在尝试输入20个或更多字符的名称,看看会发生什么。您将有未定义的行为,您的程序可能会崩溃。

无论如何,这些都是修复。

您的代码不起作用的原因是数组不可分配。它不是l-value。它是固定字节数组的开始。我知道这很令人困惑,因为你可以使用=初始化它,因此你可以这样做:

char name[20] = "Frank Smith"; // legal. This is initialisation

但你不能这样做:

char name[20];
name = "Frank Smith"; // error. This is attempted assignment.

使用std::string时,string是标准库中的一个类。 (实际上这个类是basic_string< char, char_traits<char>, allocator<char> >但是现在认为它是一个类。它的方法知道如何分配,流入,等等,并正确管理内存。

struct中的数组唯一有用的时间是,如果要将其存储到磁盘或通过需要“原始”数据的连接发送,或者要将其与“ C“或与C结构一起使用的脚本语言。

答案 2 :(得分:0)

obj [j] .name是一个数组。你无法复制那样的数组。