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

String 如何在Common Lisp中读取一行中的字符串?,string,common-lisp,String,Common Lisp,在上面一行中,我只想得到sring“aaa”,就像C中的scanf(“%s”,str)。在C中,它进行标记化,即在空白处拆分。这对应于公共Lisp中的: aaa bbb ccc 请注意,read为不带引号的字符串返回s;如果您想要s,您需要的是: (with-input-from-string (s "aaa bbb ccc") (list (read s) (read s) (read s))) ==> (AAA BBB CCC) 为了优雅地解决问题,您需要一个函数来提取单词。这

在上面一行中,我只想得到sring
“aaa”
,就像C中的
scanf(“%s”,str)

在C中,它进行标记化,即在空白处拆分。这对应于公共Lisp中的:

aaa bbb ccc
请注意,
read
为不带引号的字符串返回s;如果您想要s,您需要的是:

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

为了优雅地解决问题,您需要一个函数来提取单词。这可能有效,或者您可以找到一些好的库:

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

那“bbb”呢?是否有类似scanf(“%s”,str)的函数?还是我自己写的?谢谢!但是我想要原始字符串“aaa”而不是符号aaa。如果原始字符串是“aaa”,函数read将使所有字符都大写。请看和。但是,这些符号仍将被扣留,因此您需要取消它们的连接以进行垃圾收集。虽然可能有人已经为CL编写了一个scanf(vsedach/Vacietis似乎有一个),但我仍然会自己编写,可能使用flexi streams library。可能的重复
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
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"