Символ CR в функции gets ()

Пользователь вводит строку, возможно, разделенную табуляцией, пробелами и «вводами» (CR). Мне нужно получить все это; проблема в том, что функция gets () останавливает сканирование, когда пользователь нажимает клавишу «Enter». Есть другой способ сделать это? Я не могу использовать другие функции, кроме scanf и gets.


person shanshan    schedule 15.12.2009    source источник
comment
Любопытно, а почему вы не можете использовать другие функции? Это кажется излишне произвольным   -  person Trent    schedule 16.12.2009
comment
Похоже на домашний вопрос? возможно, вам стоит пометить это как таковое. Попробуйте спросить совета у учителя, я полагаю, он подтолкнет вас к намеченной кривой обучения.   -  person Davy Landman    schedule 16.12.2009
comment
Это похоже на публикацию здесь ... stackoverflow.com/questions/1893636/   -  person t0mm13b    schedule 16.12.2009
comment
Если вам нужны символы возврата каретки (новые строки), как узнать, когда пользователь перестал вводить данные и хочет, чтобы программа продолжила работу? Кроме того, как уже указывалось, вы не должны использовать gets () даже в игрушечном коде - это основная причина атак на переполнение буфера, и вы также можете научиться не использовать его сейчас. Вместо этого используйте fgets (); это позволяет вам сказать, насколько велик входной буфер.   -  person Jonathan Leffler    schedule 16.12.2009
comment
Всем спасибо! Это домашнее задание, поэтому я не могу использовать fgets (), хотя я и мой профессор знают о рисках. Не волнуйтесь, ребята, это простое небольшое домашнее задание, которое никому не повредит :) Пользователь вводит длину строки до самой строки, так что вот откуда я знаю ...   -  person shanshan    schedule 16.12.2009


Ответы (3)


Прежде всего: gets() действительно зло. НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ЕГО.

Невозможно написать правильную программу, используя gets().

Рассмотрим read(), getchar(), ...

person Johannes Weiss    schedule 15.12.2009
comment
Называть вещи злом бесполезно. НИКОГДА НЕ ДЕЛАЙТЕ ЭТО. Было бы более полезно, если бы вы объяснили недостатки gets() (переполнение буфера, удаление новых строк), чтобы OP могла передать знания своему начальству, чтобы настаивать на альтернативе. - person P Daddy; 16.12.2009
comment
Вызов gets () evil является точным. Обычная рекомендация, конечно, - fgets (). Хотя объяснение того, почему нужно улучшить ситуацию. - person Jonathan Leffler; 16.12.2009
comment
Печально известный червь Морриса использовал функцию gets в программе finger в unix и перезаписал стек, и именно так он распространился со скоростью лесного пожара, остальное, как они говорят, уже история. - person t0mm13b; 16.12.2009
comment
Это зло хорошо известно и не требует лишних объяснений. Быстрый поиск в Google легко ответит на этот вопрос. - person Alex Budovski; 16.12.2009
comment
Кроме того, n1336 (open-std.org/jtc1/sc22/ wg14 / www / projects # 9899) не поддерживает gets, поэтому его можно окончательно удалить из стандарта C. Конечно, поддержка C1X может занять 10+ лет, так что кто знает, когда он будет фактически удален из реализаций :-), - person Alok Singhal; 16.12.2009

Используйте петлю. Продолжайте getcing (помещая результаты в некоторый достаточно большой буфер), пока не встретите EOF.

person Anon.    schedule 15.12.2009
comment
Также не допускается использование петель. - person shanshan; 16.12.2009
comment
Если вы должны использовать gets, вам нужно будет повторно вызывать его, пока вы не соберете все данные. Как ваш профессор ожидает, что вы сделаете это без цикла? - person Anon.; 16.12.2009
comment
Вероятно, рекурсия, но я изо всех сил стараюсь этого избежать. Если нет другого решения, думаю, мне придется использовать рекурсию. - person shanshan; 16.12.2009
comment
Вы могли бы написать свою итеративную версию, чем достаточно легко преобразовать ее в рекурсивный хвостовой вызов. Сохраняет букву без петель, полностью нарушая ее дух. - person Anon.; 16.12.2009

Зачем вам «Enter»? По тому факту, что он возвращается, вы знаете, что был обнаружен возврат каретки (или конец файла).

person Trent    schedule 15.12.2009