Записать строки, введенные с клавиатуры в массив

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Записать строки, введенные с клавиатуры в массив

Сообщение pashkov » 08.12.2009 19:14:55

Здравствуйте, коллеги! Нужен совет. С паскалем знаком только в рамках университетской практики. Нужна функция, которая бы считывала строки, введенные с клавиатуры и записывала бы их в массив. Я написал ее так:
Код: Выделить всё
program Project1;
var
   str: array [0..1000] of string;
   n,i: integer;
// getlines: считывает введенные с клавиатуры строки,
// записывает их в массив str и возвращает количество
// считанных строк.
function getlines(var str: array of string): integer;
var
   i: integer;    // Счетчик строк
begin
   i := 0;        // Инициализация счетчика
// Пока не достигнут конец файла считываем следующую
// строку и увеличиваем счетчик.
   while not eof(input) do
   begin
        readln(str[i]);
        inc(i);
   end;
// Возвращаем количество считанных строк
   getlines := i;
end;
begin
   n := getlines(str);
   writeln('Количество строк: ', n);
   writeln('Массив строк:');
   for i := 0 to n do
       writeln(str[i]);
end.                   

На моем ноутбуке стоит Slackware 13 и программа работает как полагается в str записываются строки и возвращается кол-во считанных строк. Функция getlines завершает свою работу по нажатии Ctrl+D. Однако на Ubuntu 9.04, после компиляции этого же кода при нажатии Ctrl+D символ конца файла не генерируется, появляется квадратик и работа функции продолжается. С чем это может быть связано? И еще, если в цикле getlines вместо readln поставить read, то при запуске получаем Runtime Error. Почему я не могу использовать read в этом случае?
pashkov
незнакомец
 
Сообщения: 6
Зарегистрирован: 07.09.2009 23:44:02

Re: Записать строки, введенные с клавиатуры в массив

Сообщение alexrayne » 08.12.2009 20:11:55

Read неожидает Enter, ему надо указывать сколько байт надо считать в приемник точно,
если у вас неуказано, то ессно использует размер буффера по умолчанию, а сколько ето непонятно.
даже если вы указали сколько символов вводить, выделили вы память в строке приемника под них? (надо установить длинну строки >= количесву вводимых символов)
по умолчанию тип String может быть 2 вариантов Shortstring, или AnsiString - в 1м случае на каждую строку уже распределено 256байт памяти, во 2м - все строки ето указатели в никуда.
передавать в Read надо не саму строку а ее буффер в котором лежат символы а его можно взять только как адрес 1го символа строки (типа read(mystring[1], len); )

Добавлено спустя 7 минут 50 секунд:
вообче в DOSе например для окончания ввода текста надо нажимать Ctrl-Z - ето вроде acii символ EOF. наверное в убунте вам надо найти его аналог

Добавлено спустя 1 минуту 33 секунды:
если вы хотите посимвольно считывать строки с клавы то считывайте в отдельную переменную символ, а уже его прибавляйте к текущей строке
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: Записать строки, введенные с клавиатуры в массив

Сообщение pashkov » 08.12.2009 21:19:06

вообче в DOSе например для окончания ввода текста надо нажимать Ctrl-Z - ето вроде acii символ EOF. наверное в убунте вам надо найти его аналог

Не думал что EOF может быть платформо-зависимым среди Linux-систем. Вроде Linux - он и в Африке Linux. Вот может быть от раскладки зависит?
если вы хотите посимвольно считывать строки с клавы то считывайте в отдельную переменную символ, а уже его прибавляйте к текущей строке

Тогда придется как-то разбивать на строки... В С знаю перевод строки - \n, а в паскале вроде символ с кодом 13? Значит придется как-то так:
Код: Выделить всё
var
  c: char;
  i: integer;
begin
i:=0;
while not eof(input) do
  begin
    read(c);
    if (ord(c) <> 13)
      str[i]:=str[i]+c;
    else
    begin
      inc(i);
      continue;
    end;
  end;

Примерно так? Я правильно понял?
pashkov
незнакомец
 
Сообщения: 6
Зарегистрирован: 07.09.2009 23:44:02


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

Рейтинг@Mail.ru