String 如何在Common Lisp中读取一行中的字符串?
在上面一行中,我只想得到sringString 如何在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) 为了优雅地解决问题,您需要一个函数来提取单词。这
“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"