如何让用户为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
相关产品推荐
相关产品推荐

