String Ada字符串比较

String Ada字符串比较,string,ada,string-comparison,String,Ada,String Comparison,我是Ada的新手,目前正在尝试编写一个包含if-else-if语句的简单程序。代码如下: with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; procedure Year_Codes is Year : String(1..9) := " "; CharsRead : Natural; function YearCode(Name : in St

我是Ada的新手,目前正在尝试编写一个包含if-else-if语句的简单程序。代码如下:

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
procedure Year_Codes is

  Year : String(1..9) := "         ";
  CharsRead : Natural;

  function YearCode(Name : in String) return Integer is
  begin
    if(Name = "freshman")then
      return 1;
    elsif(Name = "sophomore")then
      return 2;
    elsif(Name = "junior")then
      return 3;
    elsif(Name = "senior")then
      return 4;
    else
      return 0;
    end if;
  end YearCode;


begin
  Put("Enter your academic year: ");           -- Prompt for input
  Get_Line(Year, CharsRead);                   -- Input
  Put( YearCode(Year) );                       -- Convert and output
  New_Line;
end Year_Codes;
每个答案我都得0分。关于我做错了什么的任何输入?

对字符串的
“=”
操作会比较整个字符串。如果用户输入的是
“freshman”
名称的值将是
“freshman”
,而不是
“freshman”
。阅读
Get\u Line
程序的文档

您可能应该传递
YearCode
一段
Year
字符串,而不是整个字符串
CharsRead
告诉您该切片应该是什么

具体而言,电话应为:

Put( YearCode(Year(Year'First..CharsRead)) );

下面是一个使用属性的不区分大小写的版本:

函数YearCode(名称:字符串形式)返回整数为
班级类型为(大一、大二、大三、大四);
开始
返回1+Class'Pos(Class'Value(Name));
例外
当CONSTRAINT_ERROR=>返回0时;
年底代码;

在缓冲区中有了这个额外的字符,我觉得您好像在用C语言思考字符串。你需要停止在语言中,Ada和C之间的字符串处理最为不同。

当C字符串以null结尾时,Ada字符串是而不是。相反,假设Ada字符串是字符串数组对象的大小。这只是一个简单的区别,但它在处理字符串的方式上有着巨大的影响

我在回答基本要点时对此进行了一些探讨,在Ada中,您总是试图动态地构建大小完美的字符串对象

遗憾的是,由于基于字符串缓冲区的输入,文本IO输入是一个传统上很难实现的地方。在这种情况下,您必须使用一个过大的string对象作为缓冲区,并使用返回值作为缓冲区定义区域的结尾,如Keith所示

但是,如果您有新版本的编译器,则可以使用Get_Line的函数版本来修复该问题。只需将中间两行更改为:

Put( YearCode(Get_Line) );                       

感谢您为新生工作,但之后的其他人仍在注册0。我的ifels语句有什么问题吗?@user1998581:我自己也试过,效果不错;我输入
senior
,它会打印
4
。请注意,
CharsRead
的名称在这里有点误导。Im RM,称为
Last
:此变量包含写入输入缓冲区的最后一个字符,而不是写入的字符数。当
Year'First
大于1时,差异变得(尤其明显):正确的片段仍然是
Year(Year'First..Last)
而且我注意到他的缓冲区只有9个字符长。这是可行的,但如果用户错误地输入了10个或更多的字符串,可能会表现出奇怪的行为。最好将缓冲区设置得不合理地大(例如:256,1K,诸如此类)。您的E-lisp程序应该有一个单独的问题。我已经回答了你的问题;这个答案与你的E-lisp程序无关。我想如果我问两个问题,我会被骂,但我会把它拿出来:|很抱歉,我已经编辑了你的Ada代码来更正缩进,并添加了
使用
子句。我还冒昧地更新了您的标题和标签(真正的问题是字符串比较,而不是
if
语句)。非常感谢。你帮了大忙。这里是大+1。这是我首选的方法,用于根据一组固定的允许命令字处理用户输入。再多做一点工作,您就可以得到一个版本,根据请求自动打印允许的命令(例如在contraint_错误处理程序中)。回到那一天,我甚至有一些很好的通用代码,可以使用DEC-SMG$调用自动创建菜单并处理给定枚举类型的菜单输入。