1

我正在模拟 C 中的继承,但我对该语言不太熟悉。下面是部分代码。Visual Studio 有一条错误消息,emp.name=n其中显示:

表达式必须是可修改的左值。

如何更改它以便可以修改它?

typedef struct {    
        char name[20]; 
        double salary;  
        } Employee;

Employee newEmployee(char n[], double s)
{
    Employee emp;
    emp.name=n;
    emp.salary=s;
    return emp;
}
4

3 回答 3

5

您需要将数据从复制nEmployee.name

strncpy(emp.name, n, 20);

但是,如果n不是以 NULL 结尾的,则会遇到问题。使用以下代码来保证emp.name它将是一个以 NULL 结尾的字符串:

strncpy(emp.name, n, 19);
emp.name[19] = '\0';
于 2012-05-11T00:13:05.820 回答
1

您必须使用strcpy()或相对 ( strncpy(), memmove(), memcpy(), ...) 来复制 C 中的字符串。

strcpy(emp.name, n);

这假定字符串 inn的长度比nameEmployee 结构中的字符串的长度短。如果不是,那你就有问题了。

于 2012-05-11T00:13:27.173 回答
1

其他海报正确引导您使用 strncpy。

出现有关 strcpy 与 strncpy 的评论是因为 strcpy 要求其 src 字符缓冲区为空终止,即。最后一个字符必须是 '\0' 字符。不遵循此约定会导致程序意外终止并出现分段错误。只是遇到这种情况就尴尬了。

您收到的错误消息指出,通过尝试char[] 分配给 emp.name 您正在尝试修改 struct 中 name 元素的地址。无法修改内存地址;所以你的问题的确切答案是emp.name 永远不会被修改,因为它是内存中的一个地址,你不能改变它。

所以在你的脑海里,你想我想修改emp.name 为 char 数组 n 中的数据,但是 emp.name 的地址是不可修改的。strncpy 会将 char 数组 n 中包含的数据复制到 emp.name 地址指向的 20 个字节中。

我可能没有很好地解释这一点,请多问问题。其他发帖人可以更正或完善此答案。

这是学习 C 的棘手部分;学习一些汇编语言是很有用的,并记住,当你用 C 编码时,你是编写汇编程序之上的一层薄薄的 C 语言关键字,这就是为什么它闪电般快速且容易出错的原因。

于 2012-05-11T00:47:19.067 回答