从C中的struct返回char数组时出现奇怪的字符

时间:2011-08-07 00:55:45

标签: c arrays string struct char

从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);
        }
    }
}

3 个答案:

答案 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并将垃圾放入队列(然后在服务器中打印垃圾)。