Exception handling Pascal中的长度检查

Exception handling Pascal中的长度检查,exception-handling,pascal,maxlength,string-length,Exception Handling,Pascal,Maxlength,String Length,我在第7行得到错误:操作符没有重载。我是否必须再次重复,并且不能使用和操作符 Function GetValidPlayerName : String; Var PlayerName : String; Begin Repeat Readln(PlayerName); If PlayerName = '' And Length(PlayerName) > 10 Then Write('That was not a valid

我在第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;
函数GetValidPlayerName:String; 变量 PlayerName:字符串; 开始 重复 Readln(PlayerName); 如果PlayerName=''且长度(PlayerName)>10 然后写入('这不是一个有效的名称。请重试:'); 直到PlayerName'; GetValidPlayerName:=玩家名称; 结束;
首先,您需要编写

If (PlayerName = '') And (Length(PlayerName) > 10) Then
括号是必需的

其次,它的计算结果总是
false
,因为没有一个字符串同时为空且长度为11或更长。事实上,字符串是空的当且仅当其长度为零时,所以基本上你说“如果长度为零且长度为11或更多,那么…”

您很可能希望使用析取,即使用
而不是

If (PlayerName = '') Or (Length(PlayerName) > 10) Then
如果名称为空或太长,将显示错误消息

此外,即使名称无效,循环也将退出,因为如果
PlayerName
等于
ThisisaToolLongName
,那么实际上
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;
函数GetValidPlayerName:String; 变量 PlayerName:字符串; 开始 重复 Readln(PlayerName); 如果(PlayerName='')或(Length(PlayerName)>10),则 开始 Write('这不是一个有效的名称。请重试:'); PlayerName:=''; 结束; 直到PlayerName'; GetValidPlayerName:=玩家名称; 结束; 或

函数GetValidPlayerName:String; 变量 PlayerName:字符串; 开始 结果:=''; 重复 Readln(PlayerName); 如果(PlayerName='')或(Length(PlayerName)>10),则 Write('该名称无效。请重试:') 其他的 结果:=玩家名称; 直至结果为“”; 结束;
首先,您需要编写

If (PlayerName = '') And (Length(PlayerName) > 10) Then
括号是必需的

其次,它的计算结果总是
false
,因为没有一个字符串同时为空且长度为11或更长。事实上,字符串是空的当且仅当其长度为零时,所以基本上你说“如果长度为零且长度为11或更多,那么…”

您很可能希望使用析取,即使用
而不是

If (PlayerName = '') Or (Length(PlayerName) > 10) Then
如果名称为空或太长,将显示错误消息

此外,即使名称无效,循环也将退出,因为如果
PlayerName
等于
ThisisaToolLongName
,那么实际上
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;
函数GetValidPlayerName:String; 变量 PlayerName:字符串; 开始 重复 Readln(PlayerName); 如果(PlayerName='')或(Length(PlayerName)>10),则 开始 Write('这不是一个有效的名称。请重试:'); PlayerName:=''; 结束; 直到PlayerName'; GetValidPlayerName:=玩家名称; 结束; 或

函数GetValidPlayerName:String; 变量 PlayerName:字符串; 开始 结果:=''; 重复 Readln(PlayerName); 如果(PlayerName='')或(Length(PlayerName)>10),则 Write('该名称无效。请重试:') 其他的 结果:=玩家名称; 直至结果为“”; 结束;
Urm Im在类似情况下

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;
while(长度(转换率[i].rate)2))do
开始
writeln('转换名称应为2个字母(例如,英镑到美元的转换应为“PD”);
readln(转换率[i].fromto);
结束;

不知道这是否可行,我放在这里的程序无法编译

Urm Im处于类似的情况

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;
while(长度(转换率[i].rate)2))do
开始
writeln('转换名称应为2个字母(例如,英镑到美元的转换应为“PD”);
readln(转换率[i].fromto);
结束;

不知道这是否可行,我放在这里的程序无法编译

然后while语句中的条件也必须更改。在循环中,长度不能大于10,但while条件允许任何非空字符串。我明白了,为什么圆括号会有区别?另外,我不明白为什么在输出错误后需要将PlayerName指定为blank。非常感谢您的解释。@Jeff:如果您编写
PlayerName=''或Length(PlayerName)>0
,编译器将尝试计算
'
Length(PlayerName)
之间的
,也就是说,它将假定您的意思是
PlayerName=(''或Length(PlayerName))>0
@Jeff:因为
直到PlayerName'
。只要
PlayerName
不是空字符串,循环就会终止。因此,如果用户输入的字符串过长,循环将退出,因为过长的字符串不是空的!当且仅当您希望退出循环时,即当且仅当播放器名称有效时,您需要确保满足条件
PlayerName'
。因此,每次尝试进行某种验证时,我都应该为每个验证规则使用()?谢谢你给我的帮助!然后while语句中的条件也必须更改。在循环中,长度不能大于10,但while条件允许任何非空字符串。我明白了,为什么圆括号会有区别?另外,我不明白为什么在输出错误后需要将PlayerName指定为blank。非常感谢您的解释。@Jeff:如果您编写
PlayerName=''或Length(PlayerName)>0
,编译器将尝试计算
'
Length(PlayerName)
之间的
,也就是说,它将假定您的意思是
PlayerName=(''或Length(PlayerName))>0
@Jeff:因为
直到PlayerName'
。这个循环不会发生变化