scanf необязательное соответствие - PullRequest
3 голосов
/ 16 февраля 2012

Так что мне нужно заставить scanf читать несколько строк, разделенных пробелами. Тем не менее, я не знаю заранее, сколько строк мне нужно, чтобы прочитать его, это может быть где-то от 1 до 5, но я не могу заставить scanf перестать пытаться читать после нажатия ввода во вводе. Я пытался сделать наивный %s %s %s %s %s, но, как вы можете себе представить, после нажатия клавиши ввода после произнесения всего 1 или 2 слов, он все еще ожидает прочитать больше, а затем я также попытался сделать %s%*[^\n]%s%*[^\n]%s%*[\n]%s%*[\n]%s%*[^\n], чтобы он попытался остановиться после символ новой строки, но это тоже не сработало.

Итак, каков наилучший способ заставить scanf иметь несколько дополнительных входных секций?

Спасибо.

Редактировать: я знаю о strtok и fgets, я просто смотрел, есть ли способ сделать это с помощью scanf

Ответы [ 2 ]

6 голосов
/ 16 февраля 2012

Как насчет использования fgets для чтения одной строки, а затем strotk / sscanf для ее анализа? Затем вы сможете решить, сколько строк введено пользователем.

3 голосов
/ 17 февраля 2012

scanf не предписывает чтение всей строки формата, оно прерывается, когда он получает неправильный ввод или не осталось ввода.

С http://www.cplusplus.com/reference/clibrary/cstdio/scanf/:

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

Следующий код сообщает, сколько аргументов было прочитано за scanf:

char s1[10], s2[11], s3[11], s4[11], s5[11];
int read = scanf("%10s %10s %10s %10s %10s", s1, s2, s3, s4, s5);
printf("Read %d strings", read);

Если вы введете aaa bbb ccc и нажмете Enter, будет напечатано 3, для aaa bbb ccc ddd напечатано 4 и т. Д.

...