Много тонких различий:
1) "%79[^\n]"
рассказывает scanf()
для сканирования и сохранения 1 до 79 char
кроме '\n'
. Если первый попытался выполнить сканирование, то \n
, ничего не останется. В примерах OP возвращается 0. Else a '\0'
добавляется к пункту назначения line
. Возвращается 1, если ничего больше.
2) "%79[^\n]\n"
делает 1), и в случае успеха продолжает искать любой подряд бело-пространстве, а не только '\n'
. Это, как правило, включает '\n'
и, затем все ведущие пробелы next. Он будет возвращать 1 независимо от того, найдет ли оно пробел.
3) "%79[^\n]s"
делает 1 и в случае успеха продолжает оставаться единственным s
. Он вернется 1 независимо от того, найдет ли он s
. Вероятно, это не желание OP - оставьте 's'
.
4) "%79[^\n]s\n"
делает 3) и в случае успеха, ведет себя как 2) продолжает искать любой подряд бело-пространстве, а не только '\n'
. Он будет возвращать 1 независимо от того, найдет ли оно пробел.
5) Заявление 3 while()
довольно сложное, взятое в целом. Он застревает, пытаясь прочитать '\n'
в начале 1 из 3 scanf()
.
Лучший подход, если код должен использовать scanf()
для чтения строки, является
while (scanf(" %79[^\n]%*c", line) ==1)
. Это будет подбрасывать ведущее белое пространство, а затем читать строку до '\n'
, подбрасывая это '\n'
через "%*c"
.
Наилучший подход - использовать fgets(line, sizeof line, stdin)
.
Первый - для ввода ввода типа 'string' –
@shekhar suman ... все они принимают строки – dividedbyzero
'% 79 [^ \ n]' это строка формата, не обязательно должна быть пост- исправлено с 's'. Вторая новая строка '% 79 [^ \ n] \ n' буквально переходит к следующей строке –