我收到了一个错误:
表达式必须是行
的可修改左值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);
}
请视情况提供帮助!
答案 0 :(得分:2)
obj.name
是char
的数组。您无法在阵列上进行分配。所以,如果你想坚持阵列:
strcpy(obj.name, ptr->name);
但我建议转换为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是一个数组。你无法复制那样的数组。