LINUX.ORG.RU

Неправильная компиляция в Pascal при использовании переменных типа string

 ,


0

1

Не могу заставить корректно работать программы с использованием нескольких переменных типа string на pascal.

Простой пример:

program Example;
var
    s1, s2: string;
begin
    writeln('Enter the first string');
    read(s1);
    writeln('Enter the second string');
    read(s2);
    writeln(s1);
    writeln(s2)
end.

Запущенная скомпилированная программа почему-то отказывается читать вторую переменную и выдает:

Enter the first string
12
Enter the second string
12

При этом та же самая программа, скомпилированная на телефоне (приложение Pascal N-IDE), работает корректно.

В чём может быть причина ошибки?

В чём может быть причина ошибки?

Стандартное поведение Read(строковая_переменная) не такое, как вы о нем думаете.

Этот оператор прочитает в строковую переменную из потока ввода столько символов, сколько влезает в память, отведенную под эту переменную, но не дальше, чем до конца строки (EoLn) в потоке ввода. Конец строки такой оператор преодолеть не сможет, пока не будет вызван ReadLn. В псевдокоде это может выглядеть так:

s:=''; Cnt:=SizeOf(s)-1;
while (Cnt>0) and not EoLn do begin
  Read(c); s:=s+c;
end;

(приложение Pascal N-IDE), работает корректно

Нет. Оно работает по каким-то одному ему известным правилам, которые к правилам Паскаля не имеют никакого отношения.

Как исправить, выше уже написали:

program Example;
var
    s1, s2: String;
begin
    WriteLn('Enter the first string');
    ReadLn(s1);
    WriteLn('Enter the second string');
    ReadLn(s2);
    WriteLn(s1);
    WriteLn(s2);
end.

PS. Заходите на огонёк ;)
https://www.cyberforum.ru/pascal/

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 3)
Ответ на: комментарий от bormant

Спасибо большое :D

А в чём заключается фундаментальное отличие оператора Readln от Read? Разве он не должен точно также считывать информацию до конца строки?🤔

KOMMUNIST90
() автор топика
Ответ на: комментарий от KOMMUNIST90

фундаментальное отличие оператора Readln от Read?

ReadLn после чтения из потока ввода данных для списка аргументов (в т.ч. и пустого) отбросит все остальное до EoLn.

var s1, s2, s3: String[3];
begin
  Read(s1, s2); WriteLn(s1); WriteLn(s2);
  ReadLn(s3); WriteLn(s3);
end.

var s1, s2, s3: String[3];
begin
  ReadLn(s1, s2); WriteLn(s1); WriteLn(s2);
  ReadLn(s3); WriteLn(s3);
end.

Подать на вход
12345678
abcdefgh
и сравнить результат.

bormant ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.