Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2016, 22:40   #1
Nafustal
Новичок
Джуниор
 
Регистрация: 26.02.2016
Сообщений: 2
Сообщение Ввод нескольких строк сразу (Pascal)

Задался вопросом ввод нескольких строк в одном операторе read/readln.
Оказывается, Паскаль не использует пробел как разделитель в этом случае и весь поток символов записывает в первую строковую переменную. Есть ли какой-нибудь способ решить эту проблему без использования сторонних библиотек, как в Питоне (
Код:
a,b = input().split(' ')
)?

Код:
var a,b:string;
begin
    write('Enter 2 words separated by a space: ');
    read(a,b);
    if b = '' then b := 'Empty string :(';
    writeln('a = ', a);
    writeln('b = ', b)
end.
Вывод:
Код:
Enter 2 words separated by a space: just a string, sentence
a = just a string, sentence
b = Empty string :(

Последний раз редактировалось Nafustal; 26.02.2016 в 22:45.
Nafustal вне форума Ответить с цитированием
Старый 26.02.2016, 23:00   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Если строка не предполагает содержание пробелов, то можете каждую неразрывную последовательность символов записать в отдельный элемент... массива или динамического списка.

Псевдо-код с указанием алгоритма такой
Код:
read(myString);

Анализируем строку myString. Первое слово помещаем в первый элемент массива/списка, второе - во второй и так далее
Кстати,
Цитата:
Оказывается, Паскаль не использует пробел как разделитель
А ENTER вместо пробела пробовали нажимать?
Вадим Мошев вне форума Ответить с цитированием
Старый 26.02.2016, 23:49   #3
Nafustal
Новичок
Джуниор
 
Регистрация: 26.02.2016
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
Паскаль не использует пробел как разделитель
И <Enter> - тоже.

Кстати, b := '' при выполнении операции. Проверял, присваивая значение этой переменной перед вводом.

Последний раз редактировалось Nafustal; 26.02.2016 в 23:54.
Nafustal вне форума Ответить с цитированием
Старый 27.02.2016, 23:57   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,318
По умолчанию

Как вариант. Можно использовать форматированный ввод.
Т.е. если описать две переменные, скажем:
Код:
var str1: string[15];
     str2: string;
То при вводе,
Код:
readln(str1, str2);
в str1 будет прочитано только первые 15 символов.
Остальные символы будут прочитаны и помещены в переменную str2.

Конечно, если ввод пользователем, то это как-то ...
В то же время, если ввод из форматированного файла, то всё зависит от того, как этот файл был подготовлен.

Как понимаю, это чисто теоретическое исследование, поскольку существуют и другие решения.
read() и readln() - это процедуры, которые принимают всегда строку и которые затем разбирают строку в соответствии с типами параметров.
Например, можно написать так:
Код:
var a: integer;
     b: real;
     str1: string;

...
   readln(a, b, str1); {ввести 5 6.5 Privet Vasya}
...
И всё будет нормально.
PS: Проверил на FPS, ранее проверял и работало на TP.
Столкнулся с тем, что при отслеживании (режим отладки) в окне Watches, строка содержит и символ удаления, если при вводе удалялся символ ...

Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 28.02.2016, 03:34   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Есть ли какой-нибудь способ решить эту проблему без использования сторонних библиотек, как в Питоне (
я б не заморачивался и запилил бы функцию типа дельфовой SplitString() за 5 минут, да и всё.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 28.02.2016, 07:45   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,596
По умолчанию

Цитата:
Сообщение от Nafustal Посмотреть сообщение
И <Enter> - тоже.
Для Энтера:
Код:
  readln(a);  readln(b);
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена сразу нескольких слов... FleXik Общие вопросы Delphi 11 01.12.2013 14:18
Создание нескольких компонентов сразу в цикле artemavd Общие вопросы Delphi 40 08.06.2012 20:59
Очистка сразу нескольких StringGrid Artamos Компоненты Delphi 7 13.05.2011 13:58
Установка нескольких атрибутов сразу Shouldercannon Общие вопросы Delphi 7 01.05.2011 22:49
Создание сразу нескольких txt файлов Nice42ru Помощь студентам 11 11.02.2010 18:35