Опасность при чтении строк.

Обнаружил роскошную возможность для ошибки при чтении строк из консоли (стандартный поток ввода\вывода).
Прошу модераторов перенести тему, если я выбрал не тот раздел . Проблема возникает при чтении строки с помощью процедуры Read() в цикле, либо после какого-либо иного ввода данных . Наиболее остро - при чтении последовательности строк. Вся введённая строка читается при первом вызове, все последующие же возвращают (записывают в переменную, если уточнить) пустую строку. Знаю, что проблема давно известна для файлового ввода. Может быть, для консольного тоже, но для меня стало неожиданностью. Столь большой, что я решил написать этот пост. Следующий код иллюстрирует проблему:

begin
  var c:string;
  var n:integer;

  read(n);

  while true do
    read(c)
end.

Для тех, кому запускать лень, поясню. После ввода числа, программа никогда не запросит строку. Переменной каждый раз будет присваиваться пустая строка. На мой взгляд, довольно опасная проблема для новичка в программировании.

2 лайка

Бог ты мой, сто лет в обед проблеме. Ибо сказано в Писании: “Ввод значений для присваивания их символьному типу осуществлять по Readln, а не по Read”. А Вы “с упорством бледнолицего” продолжаете наступать на эти же грабли )))

2 лайка

В своё оправдание могу сказать, что грабли были найдены не мной) Однако признаю, что на просьбу исправить ошибку на пару минут просто впал в ступор. Потому и тревожусь: для человека, который только начал изучать программирование, найти такую ошибку - нетривиальная задача. Писание же ныне у новичков не в почёте)

Это проблема новичков: если они так начинают, то хорошо не закончат. Вы предлагаете для них переписать каноническое поведение процедур ввода в Паскале или как?

Похоже надо запрещать read(string)

2 лайка

Запрещать или менять поведение процедур, конечно же, не надо. Но предупреждение можно и выводить. Лишним не будет, во всяком случае. Особенно, если учесть, что паскаль очень часто в качестве первого языка выбирают, то есть используют для обучения.

Именно с детьми такой проблемы не вызывало. Просто с азов использовать Readln. Потом узнают и о Read, но это уже не будет мешать.
Интересно, что так сложилось, но многие книги о Паскале, что используем для школьников, начинаются именно с Readln… Сейчас специально проверил самую популярную у нас - Песни о Паскале, автор Деревенец Олег, начало с Readln.

Вы правы, Использование на первых порах readln - это оптимальный выход. Тем более, раз он уже давно используется. Мне, видимо, попался новичок-уникум, раз нашёл эту ошибку.

Никогда не пользовался. Вероятно, Вы правы