【问题标题】:Pascal Coding Error?帕斯卡编码错误?
【发布时间】:2015-09-18 16:22:51
【问题描述】:

我把这段代码放到Delphi中,但出现错误

运算符不适用于此操作数类型

我不知道这意味着什么以及为什么会出现。我试图只从格式为

的电子邮件中获取姓氏
isurnameyy@kjh.com

其中 i 是首字母缩写,yy 是加入公司的年份。我知道我不能只使用 midstr 所以我尝试使用 NOT 命令来消除电子邮件的其余部分以留下姓氏。

代码如下:

uses
  System.SysUtils,
  strutils;

var email: string;

begin
writeln('input your email');
readln(email);
writeln('Your last name is ', (NOT leftstr(email,2)) AND (NOT rightstr(email,10)));
readln;
end.

【问题讨论】:

  • 错误似乎很明显。 not 不适用于字符串。你想做什么?
  • 我想输出 @ 符号之前的所有内容,但我不太确定如何在不使用 not 的情况下做到这一点。我想我假设如果你有 OR 和 AND 你也可以使用 NOT
  • 错误非常明显。您不能对字符串应用布尔运算。哪一部分让您感到困惑?
  • 忘记NOT。它不像你想象的那样工作。您应该阅读您尝试使用的语言元素的文档。您需要首先隔离 @ 字符之前的子字符串。现在您的代码没有引用 '@' 字符或其 ASCII 表示,因此这是执行步骤 1 的障碍。一旦您在 @ 之前隔离子字符串,那么您可以获得该子字符串的第一个和最后两个字符使用字符串函数。
  • 我发现这是一个非常有趣的想法:让位域确定要保留字符串中的哪些位置,并首先在位域上使用逻辑运算符(与、非、或、异或)。我一直在使用与解析器类似的东西,但结果更像是一个拼接数组(复制函数的参数)

标签: delphi pascal


【解决方案1】:

andornot 运算符不适用于字符串。您的代码远非您所需要的。

但我在这里最大的批评是字符串处理与输出代码的混合。我会写一个纯字符串处理助手。

function DecodeEmailAddressOK(
  const Address: string;
  out Initial: string;
  out Surname: string;
  out Year: Integer
): Boolean;
var
  AtPos: Integer;
begin
  AtPos := Pos('@', Address);
  if AtPos < 5 then
    Exit(False);
  Initial := Copy(Address, 1, 1);
  Surname := Copy(Address, 2, AtPos-3);
  Result := TryStrToInt(Copy(Address, AtPos-2, 2), Year);
end;

错误检查非常粗糙。我相信你会做得更好。

【讨论】:

    【解决方案2】:

    抱歉,我承认我无法对你的代码做出正面或反面。你肯定走错了路。

    但是,我可以向您展示一些非常简单的代码,应该可以帮助您:

    请注意,我是在头脑中写下这段代码。不过别担心,有人会很快纠正我的错误。 :-)

    function ExtractNameFromEmail(aEmail: string): string;
    var
      PositionOfAtSymbol: Integer;
    begin
      if not aEmail.Contains('@') then
      begin
        WriteLn('I don''t think you passed an email address');
        Exit;
      end;
    
      PositionOfAtSymbol := Pos('@', aEmail);
      Result := Copy(aEmail, 1, PositionOfAtSymbol - 1);
    end;
    

    这将为您提供您所寻找的东西。它需要一些计数(注意最后一行中需要“- 1”),但这就是你想要的。

    【讨论】:

    • 学徒模式已启用。混合助手和旧式非助手函数感觉很奇怪。也不必走线两次。调用 Pos 一次并将 Contains 替换为 Pos 返回非零值的测试。
    • 如果我们很迂腐,那么应该有一个`raise EInvalidOpException.CreateFmt('"%s" is not a valid email address', [aEmail] );'。
    【解决方案3】:

    恐怕您完全误解了逻辑运算符andornot 的含义。这些与字符串一起使用,而是与布尔值(逻辑值,truefalse)一起使用。

    not 是一元运算符,如果操作数是 false,则返回 true,如果操作数是 true,则返回 false。因此,not true 产生falsenot false 产生true

    例如,如果您有一个布尔变量 PasswordTooSimple(输入的密码太简单),您可能希望在逻辑中的某处设置 CanContinue := not PasswordTooSimple

    and 是布尔值的二元运算符,当且仅当它的两个操作数都是true 时才返回true。例如,CanContinue := ValidUser and not PasswordTooSimple

    or 是布尔值上的二元运算符,当且仅当它的至少一个操作数为真时才返回true。例如,CanContinue := (PaymentComplete or NoncommersialVersion) and not PasswordTooSimple

    如果 PaymentCompleteNoncommersialVersionPasswordTooSimple 分别是 falsetruefalse,那么应用这些规则,我们发现 PaymentComplete or NoncommersialVersion 将计算为 truenot PasswordTooSimple 将计算为 true,因此 - 整个表达式 (PaymentComplete or NoncommersialVersion) and not PasswordTooSimple = true and true = true,因此 CanContinue 将是 true。例如,您可能有btnContinue.Enabled := CanContinue

    顺便说一句,现在您知道编译器所说的“运算符不适用于此操作数类型”是什么意思了。确实,错误消息很明显:not 运算符不适用于字符串操作数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多