Странные символы при возврате массива char из структуры в C - PullRequest
0 голосов
/ 07 августа 2011

У меня возникают некоторые проблемы при возврате с printf массива char из структуры в C.

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

Он просто возвращает некоторые странные символы, такие как "приоритет: 1 имя: ▒▒ (" а не "приоритет: 1 имя: привет"

Язаполнение структуры с использованием следующего кода

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, поэтому я не слишком разбираюсь в использовании структур. Пожалуйста, дайте мне знать, если больше контекста или частей коданужна любая помощь.

Я добавил немного больше кода в Enter выше, а вот еще код, когда enter и 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 ]

2 голосов
/ 07 августа 2011

Единственная очевидная ошибка в вашем коде заключается в том, что вы должны явно заполнить ноль на s_entry.mtext[MAXLENGTH], чтобы строка по-прежнему заканчивалась нулем, если strncpy () достигнет предела.Но если бы это была проблема, вы бы увидели «привет» , а затем странные символы.Вы уверены, что objname указывает на текст, на который вы ожидаете, что он будет указывать?

Кроме того, выглядит немного странно, что proc_obj () объявлен как возвращающий int, но фактически ничего не возвращает.Ваш компилятор должен пожаловаться на это.

1 голос
/ 07 августа 2011

Ответ перед добавлением кода

Похоже, что структура s_entry является локальной, а enter работает с локальной переменной. Как вы звоните enter и возвращаете структуру после ее инициализации? обратите внимание, что у вас есть int в качестве типа возврата функции enter. Если вы делаете return s_entry;, тогда возможен вывод, который вы получаете, так как рассматривается только первое слово структуры, то есть нижняя sizeof (int) часть mtype.

Если вы используете функцию enter, подобную этой, как я описал выше, сделайте тип возврата от enter до struct s_entry


Вы должны проверить размер len при отправке сообщения.

0 голосов
/ 07 августа 2011

Вы не показываете вызов очереди сообщений, но я предполагаю, что вы как-то неправильно вызываете API и помещаете мусор в очередь (а затем печатаете мусор на сервере).

...