帕斯卡语中的类型检查

8
我很想知道在Pascal中如何进行类型检查?我已经搜索了几个小时,但是没有找到有用的信息。
例子:
var 
number: Integer;

begin
  write('Enter a number: ');
  read(number);

  if {How am I supposed to check if 'number' is an Integer here?}
  then writeln(number)
  else writeln('Invalid input')
end.

+1 的投票是为了认识到某些拼图缺失,应该有一种方法来检查 IO 错误。 - Marco van de Voort
6个回答

6

实际上,您正在进行I/O类型检查。您可以通过暂时禁用它然后检查结果来解决这个问题:

 {$I-}  //turn off IO checking temporarily
 read(i);
 {$I+}  // and back on

 if ioresult=0 then  // check the result of the last IO operation
   writeln('integer successfully read:',number)
 else
   writeln('invalid input');

注意:通常的答案是“只需读取字符串并自行转换”,但在不做终端类型假设的情况下,很难做到这样的优雅处理。
对于简单明了的程序,如果你只需要某种程度上验证过的输入,上述技巧(以及围绕它的重复错误的循环)就足够了。

2
也许 Val 这个过程可以帮助你。这是 fpc 的一个实例。但是请更改你的逻辑,将其读入一个字符串并使用Val进行验证。你可以在这里找到一个示例。

1

太简单了,看看我的代码:

program int_check;
uses crt;
var n:real;
begin 
     clrscr;
     write('Enter a number: ');readln(n);
     if n-round(n)=0 then write('Integer!') else write('Not an Integer!');
     readln;
end.

你看,没有字符串,没有IOcheck,而且适合你的表格!


0

直接使用frac(n)

program int_check; uses crt; var n:real; begin clrscr; write('输入一个数:');readln(n); if frac(n)=0 then write('整数!') else write('不是整数!'); readln; end.


0

由于number是一个整数(Integer),如果用户输入了非数字值,则应用程序将失败。您将永远无法到达if语句。


1
这并不一定是真的。这取决于IO检查的状态,诚然,在大多数编译器中默认情况下是开启的。 - Marco van de Voort

-2

这个问题很老了,但也许这段代码能帮到某些人。

function GetVariableType (StringToCheck: String): String;
var
  xInteger: Integer;
  xBoolean: Boolean;
  xDouble: Double;
  xVarType: String;
begin
  xVarType:='VARCHAR';
  if TryStrToBool(StringToCheck,xBoolean) then xVarType:='BOOLEAN';
  if TryStrToFloat(StringToCheck,xDouble) then xVarType:='FLOAT';
  if TryStrToInt(StringToCheck,xInteger) then xVarType:='INTEGER';
  
  GetVariableType := xVarType;
end;

当然,这可以重构为返回布尔值。


'GetVariableType'的答案极度依赖于某个品牌的Pascal编译器提供的函数...而且,我怀疑他们可能会忽略一些不正确数据类型。一般来说,对于Pascal、C和其他类似语言,解决这个问题的方法是编写(或查找)自己的解析器。这样的解析器将接受一串字符并检查它们,然后返回一个神奇的值告诉您:
  • 它是数字、字符串、字符、单词、空还是未知
  • 如果是数字,则可能在第二个变量中返回32位或64位的值。
  • 如果是字符串,则可能返回该字符串。
- Stan Sieler
当然,这只是一个非常基本的函数,可能不够用。我使用这个函数来查找CSV文件中每一列中的数据类型,以创建SQL导入字符串。到目前为止,它从未让我失望,数据始终被正确地准备和导入。 - jirihunacekcz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接