Как sscanf может читать до пробела, табуляции или новой строки - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть какое-то задание по курсу программирования. Я беру этот термин на C, и у меня возникли проблемы с использованием функции sscanf.

Программа фактически должна получить от пользователя строкуданные студента в следующей форме:

<ID> <NAME> <GRADE> <AGE> <COUNTRY> <CITY>

У нас есть некоторые ограничения в отношении формы каждого поля, например, поле идентификатора должно состоять из 10 цифр и не начинаться с 0.

Важная вещь с вводом: пользователь должен написать свои данные, где они разделены табуляцией (\ t).

Поэтому я попытался разбить его на поля, используя sscanf. Я думал, что если я использую [^\t\n ], тогда он «поймет», что это одно поле.

Проблема связана с sscanf, вот мое использование функции:

            // Parse his details
            sscanf(line, "%[^\t\n]\t%[^\t\n ]\t%u\t%u\t%[\t\n ]\t%[\t\n]\t", tmpStudent.ID, tmpStudent.name,
                    &tmpStudent.grade, &tmpStudent.age, tmpStudent.country, tmpStudent.city);

Но когда я запускаю программу, переменная ID «съедает» поле имени, а поле имени остается пустым.

Как мне решить эту проблему?

Спасибо.

1 Ответ

0 голосов
/ 04 ноября 2019

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

Но мне кажется, это работает:

 int n = sscanf(line, "%[^\t]\t%[^\t]\t%u\t%u\t%[^\t]\t%[^\t]",
                tmpStudent.ID,
                tmpStudent.name,
                &tmpStudent.grade,
                &tmpStudent.age,
                tmpStudent.country,
                tmpStudent.city);

Важно всегдапроверьте возвращаемое значение из sscanf(), чтобы убедиться, что вы получили все шесть запрашиваемых элементов.

В этой версии строки формата я добавил искусственный интервал, чтобы вам было легче читать, выудалите их для реального использования (конечно), но это основано на требовании, чтобы вкладки разделяли все:

"%[^\t]  \t  %[^\t]  \t  %u  \t  %u  \t  %[^\t]  \t  %[^\t]"

Насколько я могу судить, все, что вас волнует, - это набор символов, который не вкладка.

...