如何编辑字符串(在C结构中)

时间:2012-05-11 00:10:55

标签: c string struct

我在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;
}

3 个答案:

答案 0 :(得分:5)

您需要将数据从n复制到Employee.name

strncpy(emp.name, n, 20);

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

strncpy(emp.name, n, 19);
emp.name[19] = '\0';

答案 1 :(得分:1)

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

strcpy(emp.name, n);

这假设n中字符串的长度短于Employee结构中的name。如果不是,那你就遇到了问题。

答案 2 :(得分:1)

其他海报是正确的,引导你使用strncpy。

围绕strcpy vs strncpy的注释出现是因为strcpy要求其src字符缓冲区为空终止,即。最后一个字符必须是一个'\ 0'字符。如果不遵循此约定,则程序会因分段错误而意外终止。当发生这种情况时,这简直令人尴尬。

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

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

我可能没有很好地解释这一点,请问更多问题。其他海报可以纠正或改进这个答案。

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