【问题标题】:How to edit Strings (in C structs)如何编辑字符串(在 C 结构中)
【发布时间】:2012-05-11 00:10:55
【问题描述】:

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

【问题讨论】:

    标签: c string struct


    【解决方案1】:

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

    strncpy(emp.name, n, 20);
    

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

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

    【讨论】:

    • 哎呀,请把它写成strncpy
    • 请注意,strncpy(emp.name, n, sizeof(emp.name)-1); 会更好,您仍然必须添加 emp.name[sizeof(emp.name)-1] = '\0'; 以保证空终止。
    【解决方案2】:

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

    strcpy(emp.name, n);
    

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-06-27
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-30
        • 2023-01-08
        • 1970-01-01
        • 2018-05-23
        相关资源
        最近更新 更多