Ada字符串比较

时间:2013-02-06 22:01:06

标签: 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 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。关于我做错了什么的任何输入?

3 个答案:

答案 0 :(得分:6)

字符串上的"="操作会比较整个字符串。如果用户的输入为"freshman",则Name的值为"freshman ",而不是"freshman"。阅读Get_Line程序的文档。

你应该传递YearCode字符串的Year slice ,而不是整个字符串; CharsRead告诉你切片应该是什么。

具体来说,呼叫应该是:

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

答案 1 :(得分:3)

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

   
function YearCode(Name : in String) return Integer is
    Type Class is (Freshman, Sophmore, Junior, Senior);
begin
    Return 1 + Class'Pos(Class'Value(Name));  
exception
    When CONSTRAINT_ERROR => Return 0;
end YearCode;

答案 2 :(得分:2)

在你的缓冲区中有了这个额外的字符,我觉得你在想C语言中的字符串。你需要阻止它。 在语言的所有内容中,字符串处理在Ada和C之间是最不同的。

当C字符串以空值终止时,Ada字符串。相反,Ada字符串被假定为字符串数组对象的大小。它只是一个简单的区别,但它对你处理字符串的方式产生了巨大的影响。

我在回答How to I build a string from other strings in Ada?时对此有所了解。基本的要点是,在Ada中,你总是尝试在运行中构建完美大小的字符串对象。

可悲的是,由于基于字符串缓冲区的输入,Text_IO输入传统上非常难以实现。在这种情况下,你被迫使用一个过大的字符串对象作为缓冲区,并使用返回的值作为缓冲区定义区域的末尾,正如Keith所示。

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

Put( YearCode(Get_Line) );