你如何阅读和比较计划中的字符串?

时间:2014-04-09 21:35:22

标签: scheme

显然还没有完成,但我想要做的是从用户那里获取输入并搜索列表中的数字或字符串。 如果我只使用数字,它工作正常,但如果我使用字符串则失败。 我怎样才能做到这一点?

谢谢。

我的代码失败了

Enter student name or ID : damien
. . string=?: contract violation
  expected: string?
  given: damien
  argument position: 1st
  other arguments...:
   damien

导致问题的部分有一个指向它的carret

(define (student l s)
  (cond 
    ((and (number? s) (= (car (car l)) s))
     (newline)
     (display "ID=")(display (car (car l)))
     (display ", Name=")(display (car (cdr (car l))))
     (display ", Grade=")(display (car (cdr (cdr (car l)))))
     (newline)
     )
   ->((string=? (car (cdr (car l))) s)
     (newline)
     (display "ID=")(display (car (car l)))
     (display ", Name=")(display (car (cdr (car l))))
     (display ", Grade=")(display (car (cdr (cdr (car l)))))
     (newline)
     )
    ((null? l) (display "Student not found")(newline))
    )
  )
(define (display-student l) 
  (display "Enter student name or ID : ")
  (student l (read))
  )

2 个答案:

答案 0 :(得分:2)

read读取列表结构,就像方案的源代码一样。因此read将读取一个字符串,如果它用双引号括起来的话。没有它,它会认为它是symbol。也许read-line更适合通用字符串输入?

答案 1 :(得分:0)

就像你对cond的第一个句子(调用number?)所做的那样,你需要对第二个句子做同样的事情:

(string=? ...)替换为

(and (string? (car (cdr (car l))))
     (string? s)
     (string=? (car (cdr (car l))) s))

执行此操作后,可能会出现其他错误,但您仍可以继续。例如,如果用户只键入名称(不带引号),read函数将返回symbol?。但是如果用户输入两个名字,比如'Ron Paul',作为第一个+最后一个,那么你将获得意想不到的结果。