Вопрос в том, как scanf_s обнаруживает символы в C - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь понять, как эти напечатанные коды влияют на результат. Функция fscanf_s.

Есть 3 вещи, которые я не понимаю.

  1. В строках 11 и 12, между &c1, &c2 и &c3, вводятся определенные числа. Удаление этих чисел приведет к тому, что out.txt выведет пустой пробел. Я понятия не имею, зачем нужны числа между ними.

  2. В строке 11 помещается %3c, а c2 для fprintf в строке 13 просто пустое место. Я понятия не имею, что здесь означает %3c. Насколько я знаю, термин должен означать принятие трех символов, но, похоже, что это не тот случай.

  3. В строке 12 помещается %%, в результате чего изменяется только c4. Я понимаю, что %% может остановить процесс сканирования, но я не слишком уверен в этом. fscanf_s не признал, что после %% он должен отсканировать еще один %c?

Я знаю, что fscanf_s показывает поведение, подобное scanf_s, но зная их, я не получил ответа.

char c1 = 'a', c2 = 'b', c3 = 'c', c4 = 'd', c5 = 'e', c6 = 'g';

int i, j;
FILE* infile, * outfile;
fopen_s(&infile, "data.txt", "r");
fopen_s(&outfile, "out.txt", "w");

i = fscanf_s(infile, "%c%3c%c", &c1, 1, &c2, 1, &c3, 1); //this line 11
j = fscanf_s(infile, "%c %% %c", &c4, 1, &c5, 1, &c6, 1);//and this line 12
fprintf(outfile, "%c%c%c: (%d)\n", c1, c2, c3, i);
fprintf(outfile, "%c%c%c: (%d)\n", c4, c5, c6, j);

data.txt печатает ниже:

ABCDEFGHIJKLMN

out.txt печатает ниже:

A c: (1)
Deg: (1)

1 Ответ

0 голосов
/ 01 июля 2019

Вы должны воздерживаться от поиска информации на CppReference. Эта единственная страница дала мне много информации об ответе, который вы спрашиваете здесь. Хотя я должен признать, что некоторые варианты поведения все еще не очевидны, но я надеюсь, что смогу помочь вам лучше понять, что происходит в вашем коде.

  1. fscanf_s совпадает с [fscanf], за исключением того, что спецификаторы преобразования %c, %s и %[ каждый ожидают два аргумента (обычный указатель и значение типа rsize_t, указывающее размер получающего массива, который может быть 1 при чтении с% c в один char) ". (источник: ссылка выше)

    Хорошо, там вы нашли, откуда берутся ваши дополнительные номера. Это просто цифры, которые указывают количество символов, которые вы получите, которые должны быть один для char.


  1. Следующие ошибки обнаруживаются во время выполнения и вызывают установленный в данный момент обработчик ограничений function: [...] Количество символов, которое будет записано с помощью %c, %s или %[ плюс завершающий нулевой символ будет превышать второй аргумент (rsize_t), предоставленный для каждого из этих спецификаторов преобразования (источник: ссылка выше)

    Это означает, что при использовании %3c, но с параметрами &c2, 1 вы пытаетесь получить 3 символа из вашего файла, но хотите получить только один в c2 ... Что должно привести к ошибке, обработанной обработчиком ограничения функция и ваш вызов в строке 11 должен возвращать EOF. Должен признать, что я все еще немного запутался в поведении, которое вы получаете (вызов функции возвращает 1), но определенно что-то не так с использованием %3c с параметрами &c2, 1.


  1. %% соответствует буквальному% (источник: ссылка выше)

    Использование %%, кажется, заставляет fscanf_s найти символ % внутри infile. Поскольку он не видит ничего, он просто просматривает ваш файл, достигает EOF и завершает функцию без изменения c5 и c6.

...