我有一个程序,用户输入一个用于创建文件的字符串。如何确保字符串对于文件创建是安全的。我想到的一种方法是:
(define (safestr sentstr)
(list->string
(remove*
(list "|" ";" ":" "/" "\\" "\'" "\"")
(string->list sentstr) )))
但它不起作用。
(println (safestr "abcd \\ \\ d /e / f | ; : d ef "))
"abcd \\ \\ d /e / f | ; : d ef "
这样做的最佳方式是什么?
答案 0 :(得分:2)
你问:
How can I make sure that the string is safe for file creation.
执行此操作的最佳方法是使用内置功能。
特别是,如果输入不是合法路径,则absolute-path?
和relative-path?
函数将返回#f
。
请参阅documentation。
答案 1 :(得分:1)
原因是string->list
返回字符列表,而不是字符串。试试这个:
(define (safestr sentstr)
(list->string
(remove*
(list #\| #\; #\: #\/ #\\ #\' #\")
(string->list sentstr) )))
(print (safestr "abcd \\ \\ d /e / f | ; : d ef "))
;; -> abcd d e f d ef
您可以通过使用DrRacket的交互性来发现这类事物。例如,您看到函数safestr
未返回预期结果。然后,您可以在交互窗口中开始尝试函数的主要组件。因此,在这种情况下,您可以尝试第一次调用函数:
(string->list "abcd \\ \\ d /e / f | ; : d ef ")
看看它的结果。它显示如下:
'(#\a
#\b
#\c
#\d
#\space
... other lines missing ...
您可以立即从中看到结果是字符列表,而不是字符串。
这是工具允许的交互式编程风格的本质,作为Lisp语言的REPL环境。
另一个重要且非常有用的工具是调试器:使用它可以逐步完成程序并查看每个语句的效果。只需几步即可找到错误。
一般来说,DrRacket是一个非常有用的IDE,我的建议是至少要学习它的主要功能,以加快程序的开发。