如何在Common Lisp中读取一行中的字符串?

时间:2014-11-30 17:57:52

标签: string common-lisp

aaa bbb ccc

对于上面一行,我只想获得字符串"aaa",就像C中的scanf("%s",str)一样。

2 个答案:

答案 0 :(得分:1)

要优雅地解决您的问题,您需要一个提取单词的功能。这可能有用,或者你可以找到一些好的库:

CL-USER> (defun split (str token &aux result (len (length str)))
           (labels ((rec (i)
                      (if (< i len)
                          (let ((p (or (position token str :start i)
                                       len)))
                            (when (/= p i)
                              (push (subseq str i p) result))
                            (rec (1+ p)))
                          (reverse result))))
             (rec 0)))
SPLIT

此函数遍历给定的字符串并复制其不包含给定标记的部分。请注意我们如何在每次递归调用时复制整个字符串,但移动指针&#39; i知道从哪里开始下一次搜索。

现在,您可以使用nth访问任何字词:

CL-USER> (nth 0 (split "aaa bbb ccc" #\space))
"aaa"
CL-USER> (nth 1 (split "aaa bbb ccc" #\space))
"bbb"
CL-USER> (nth 2 (split "aaa bbb ccc" #\space))
"ccc"

答案 1 :(得分:0)

在C中,scanf执行标记化,即它在空格上分割。这对应于Common Lisp中的read

(with-input-from-string (s "aaa bbb ccc")
  (list (read s) (read s) (read s)))
==> (AAA BBB CCC)

请注意,read会返回symbol个未加引号的字符串;如果你想要string,你正在寻找类似的东西:

(defparameter *my-string* "aaa bbb ccc")
(subseq *my-string* 0 (position #\Space *my-string*))
==> "aaa"