Какой тип аргумента ожидает sscanf для класса символов? - PullRequest
3 голосов
/ 31 октября 2010

Я пытался заставить sscanf распознать довольно простой формат, используя классы символов.Я заметил, что когда я предоставляю sscanf char* для соответствия классу символов, он перезаписывает предыдущий байт также, как если бы он ожидал указатель на 2 байта.

Упрощенная версия того, что я 'm пытается выполнить:

#include <stdio.h>

int main(void)
{
    char num1;
    char num2;
    int s;
    s = sscanf("1,2", " %[01234567] , %[01234567]", &num1, &num2);
    printf("%d %c %c\n", s, num1, num2);
    return 0;
}

Ожидаемый вывод: 2 1 2

Фактический вывод: 2 2

Но если я заменю char на short (или что-то большее, чем байт), тогда он работает, как и ожидалось, но я получаю предупреждения о format expects type char*.

Какого типа должен быть аргумент или я делаю какую-то другую ошибку?

1 Ответ

3 голосов
/ 31 октября 2010

sscanf ожидает строку.

char num1[BIG_ENOUGH], num2[BIG_ENOUGH];
s = sscanf("1,2", " %[01234567] , %[01234567]", num1, num2);

Конечно, это совершенно небезопасно, поскольку отсканированная строка плюс завершающий ноль могут быть длиннее буфера и вызывать переполнение буфера.

К сожалению, система типов C не может различить указатель на начало массива символов и указатель на один символ, поэтому код в вопросе скомпилирован.

...