Проверка длины в Паскале - PullRequest
0 голосов
/ 21 мая 2011

Я получаю сообщение об ошибке Ошибка: оператор не перегружен в строке 7. Нужно ли делать еще одно повторение и я не могу использовать операторы и ?

Function GetValidPlayerName : String;
  Var
    PlayerName : String;
  Begin
    Repeat
      Readln(PlayerName);
      If PlayerName = '' And Length(PlayerName) > 10
        Then Write('That was not a valid name.  Please try again: ');
    Until PlayerName <> '';
    GetValidPlayerName := PlayerName;
  End;

Ответы [ 2 ]

3 голосов
/ 21 мая 2011

Во-первых, вам нужно написать

If (PlayerName = '') And (Length(PlayerName) > 10) Then

Требуются круглые скобки.

Во-вторых, всегда оценивается как false, потому что нетСтрока, которая является пустой и имеет длину 11 или более.Действительно, строка пуста тогда и только тогда, когда ее длина равна нулю, поэтому в основном вы говорите: «Если длина равна нулю, а длина равна 11 или более, то ...».

Скорее всего, вы хотите вместо этогоиспользовать дизъюнкцию, то есть использовать or вместо and:

If (PlayerName = '') Or (Length(PlayerName) > 10) Then

Это отобразит сообщение об ошибке, если имя пустое или , если оно слишкомlong.

Кроме того, цикл завершится, даже если имя неверно, потому что если PlayerName равно ThisIsATooLongName, то действительно PlayerName <> ''.

Что вам нужно, это что-токак

Function GetValidPlayerName : String;
Var
  PlayerName : String;
Begin
  Repeat
    Readln(PlayerName);
    If (PlayerName = '') Or (Length(PlayerName) > 10) Then
    Begin
      Write('That was not a valid name.  Please try again: ');
      PlayerName := '';
    End;
  Until PlayerName <> '';
  GetValidPlayerName := PlayerName;
End;

или

Function GetValidPlayerName : String;
Var
  PlayerName : String;
Begin
  result := '';
  Repeat
    Readln(PlayerName);
    If (PlayerName = '') Or (Length(PlayerName) > 10) Then
      Write('That was not a valid name.  Please try again: ')
    Else
      result := PlayerName;
  Until result <> '';
End;
0 голосов
/ 31 марта 2015

Урм Я в подобной ситуации,

while(Length(conversionrates[i].rate)<>2)) do
begin
    writeln('the conversion name should be 2 letters. (E.G Pounds to Dollars would be "PD")');
    readln(conversionrates[i].fromto);
end;

Интересно, сработает ли это, программа, которую я поставил, не будет компилироваться.

...