You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让用户为msgbuf.mtext输入自定义内容?赋值报错问题求解

问题分析与解决方法

错误原因

报错expression must be a modifiable lvalue出现在msg.mtext = "hello";这一行——C语言中字符数组名是不可修改的地址常量,不能直接用赋值运算符=给数组整体赋值字符串常量。

解决办法

1. 使用strcpy赋值字符串常量

需要引入<string.h>头文件,通过字符串拷贝函数完成赋值:

#include <string.h>
// ...
struct msgbuf msg;
msg.mtype = 1; // 消息队列要求mtype必须是大于0的整数
strcpy(msg.mtext, "hello");

2. 定义结构体变量时直接初始化

如果是在定义阶段赋值,可以用初始化语法:

struct msgbuf msg = {.mtype = 1, .mtext = "hello"};

3. 实现用户输入自定义消息

用fgets读取用户输入,同时处理输入末尾的换行符:

struct msgbuf msg;
msg.mtype = 1;
printf("请输入要发送的消息:");
fgets(msg.mtext, sizeof(msg.mtext), stdin);
// 移除fgets读取的换行符
size_t len = strlen(msg.mtext);
if (len > 0 && msg.mtext[len-1] == '\n') {
    msg.mtext[len-1] = '\0';
}

修正后的完整代码

#include <stdio.h>
#include <sys/msg.h>
#include <string.h>
#include <errno.h>

struct msgbuf {
    long mtype;
    char mtext[80];
};

int main() {
    int qid;
    int msgkey = 1234;

    // 创建/获取消息队列,添加错误检查
    qid = msgget(msgkey, IPC_CREAT | 0666); 
    if (qid == -1) {
        perror("msgget 失败");
        return 1;
    }

    struct msgbuf msg;
    msg.mtype = 1; // 必须设置有效的消息类型(>0)
    
    // 读取用户输入
    printf("请输入要发送的消息:");
    if (fgets(msg.mtext, sizeof(msg.mtext), stdin) == NULL) {
        perror("读取输入失败");
        return 1;
    }
    // 移除换行符
    size_t len = strlen(msg.mtext);
    if (len > 0 && msg.mtext[len-1] == '\n') {
        msg.mtext[len-1] = '\0';
    }

    // 发送消息,使用实际消息长度而非数组总大小
    if (msgsnd(qid, (void *)&msg, strlen(msg.mtext) + 1, 0) == -1) {
        perror("msgsnd 失败");
        return 1;
    }
    printf("已发送:%s\n", msg.mtext);

    return 0;
}

额外注意点

  • 消息类型mtype必须大于0,否则msgsnd会执行失败
  • msgsnd的第三个参数建议传实际消息长度(strlen(msg.mtext)+1,包含字符串终止符),避免发送多余的空字符
  • 始终添加系统调用的错误检查,方便快速定位问题

内容的提问来源于stack exchange,提问作者Halaviw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:01:03