Формат% c ожидает аргумент типа char *, но имеет int - PullRequest
0 голосов
/ 15 апреля 2020

Итак, я знаю, что определил символ. Но что-то раздражает компилятор.

        char direction;
        int exit, firstLine, length;
        firstLine = 0, exit = 0;

        /* Boolean for the whether size has been read. */
        while (((fgets(line, sizeof(line), boardFile)) != NULL) || exit == 1)
        { 
            if (firstLine == 0)                                     /* Easy way of handling reading width/height. */
            {
                /* Split for size and width. */
                sscanf(line, "%d,%d", widthPtr, heightPtr);             /* Store width and height inside width/height. */
                firstLine++;
                if (VALIDSIZE(*widthPtr))
                {
                    if (!(VALIDSIZE(*heightPtr)))
                    {
                        printf("%d is an invalid Height. Must be between 1 and 12 (Inclusive).", *heightPtr);
                        exit = 1;
                    }
                }
                else
                {
                    printf("%d is an invalid Width. Must be between 1 and 12 (Inclusive).", *widthPtr);
                    exit = 1;
                }
            }
            else
            {
                Ship* newShip;
                sscanf(line, "%s %c %d %[^\n]", location, direction, &length, name);    /* Parse into vars. */
                newShip = createStruct(location, direction, length, name);              /* Need a createStruct method so it doesn't store the same Struct in the same memory location. */
                insertLast(list, newShip);                                              /* Add to the list of structs. */
            }   

Я получаю ошибку

format %c expects argument of type char* but argument has type int.

Я пытаюсь прочитать в этой строке

D4 E 3 NullByte Sub

Он работал как символ *, но мне нужно было, чтобы он был символом, так как в любом случае это всего лишь один символ.

E - это то, что я пытаюсь отсканировать в символ, а scanf - это то, что выдает ошибку.

Любая помощь велика, спасибо

1 Ответ

1 голос
/ 15 апреля 2020

Хотя это не MCVE, который я могу скомпилировать и протестировать, вам, вероятно, нужно было написать

sscanf(line, "%s %c %d %[^\n]", location, &direction, &length, name);

То есть аргумент, соответствующий %c, должен быть указателем на char, точно так же, как для %d должен быть указатель на int.

Вы получили сбивающее с толку сообщение, в котором упоминалось int из-за исторической причуды C: variadi c параметров функции (... после строки формата) все еще продвигаются с использованием старых правил, предшествовавших ANSI C. Итак, char расширяется до int. Это было для обратной совместимости с кодом 70-х и 80-х годов.

...