从C中的结构返回printf
个char数组时遇到一些问题。
struct q_entry
{
long mtype;
char mtext[MAXLENGTH + 1];
};
结构中的long mtype
返回正常,但字符串只返回一些奇怪的字符。
int proc_obj(struct q_entry *msg)
{
printf("\npriority: %ld name: %s\n", msg->mtype, msg->mtext);
}
它只返回一些奇怪的字符,如“priority:1 name:▒▒(”而不是“priority:1 name:hello”
我使用以下代码填充结构
int enter(char *objname, int priority)
{
...
strncpy(s_entry.mtext, objname, sizeof(s_entry.mtext) - 1);
s_entry.mtype = priority;
// Send the message
if (msgsnd(s_qid, &s_entry, len, 0) == -1)
{
printf("error: msgsnd failed\n");
return(-1);
}
else
{
return(0);
}
}
我对C没有太多经验,所以我对使用结构不太了解。如果需要更多上下文或部分代码,请告诉我。任何形式的帮助都会非常有用。
我在上面的输入中添加了一些代码,这里有更多代码,当输入和proc_obj被称为
main(int argc, char **argv)
{
int priority;
if (argc != 3)
{
printf("error: incorrect number of arguments\n");
exit(1);
}
else
{
priority = atoi(argv[2]);
}
if (enter(argv[1], priority) < 0)
{
printf("error: message entering failed\n");
exit(1);
}
exit(0);
}
这与输入及以上代码
的文件不同int server(void)
{
int mlen, r_qid;
struct q_entry r_entry;
// Initialize queue
if ((r_qid = init_queue()) == -1)
return(-1);
for (;;)
{
if ((mlen = msgrcv(r_qid, &r_entry, MAXLENGTH, (-1 * MAXPRIOR), MSG_NOERROR)) == -1)
{
printf("error: msgrcv failed\n");
exit(1);
}
else
{
proc_obj(&r_entry);
}
}
}
答案 0 :(得分:2)
您的代码中唯一明显的错误是您应该在s_entry.mtext[MAXLENGTH]
显式填写零,以便在strncpy()达到限制时字符串仍将为零。但如果这是问题,你会看到“你好”后跟奇怪的字符。您确定objname
指向您希望它指向的文字吗?
此外,proc_obj()被声明为返回int但实际上不返回任何内容看起来有点奇怪。你的编译器应该抱怨这个。
答案 1 :(得分:1)
在添加更多代码之前回答
看起来s_entry
结构对象是本地的,enter
对局部变量起作用。在初始化之后,您如何调用enter
并返回结构?请注意,您有int
作为enter
函数的返回类型。如果您正在执行return s_entry;
,那么您可以获得输出,因为只考虑结构的第一个单词,即sizeof (int)
的{{1}}部分。
如果您使用上述mtype
功能,请将enter
的返回类型设为enter
发送邮件时,您应该检查struct s_entry
的大小。
答案 2 :(得分:0)
您没有显示消息队列调用,但我的猜测是您错误地调用了API并将垃圾放入队列(然后在服务器中打印垃圾)。