使字符串安全以在 Racket 中创建文件

Make string safe for file creation in Racket

我有一个程序,用户可以在其中输入用于创建文件的字符串。我怎样才能确保该字符串对于文件创建是安全的。我想到的一种方法是:

(define (safestr sentstr)
   (list->string
    (remove*
     (list "|"  ";"  ":"  "/" "\" "\'" "\"")
     (string->list sentstr) )))

但是不行。

(println (safestr "abcd \ \ d /e / f | ; : d ef "))
"abcd \ \ d /e / f | ; : d ef "

最好的方法是什么?

原因是 string->list returns 一个字符列表,而不是字符串列表。试试这个:

(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 没有 returns 预期的结果。然后你就可以开始在交互中尝试你的函数的主要组件了window。因此,在这种情况下,您可以尝试第一次调用该函数:

(string->list "abcd \ \ d /e / f | ; : d ef ")

看看它的结果是什么。它显示如下内容:

'(#\a
  #\b
  #\c
  #\d
  #\space
 ... other lines missing ...

从中您可以立即看出结果是字符列表,而不是字符串列表。

这是 Lisp 语言的 REPL 环境等工具允许的交互式编程风格的本质。

另一个重要且非常有用的工具是调试器:使用它您可以单步执行程序并查看每条语句的效果。只需几步,您就可以找到错误。

总的来说,DrRacket 是一个非常有用的 IDE,我的建议是至少学习它的主要功能,以加快您的程序开发。

你问:

How can I make sure that the string is safe for file creation. 

执行此操作的最佳方法是使用内置功能。 特别是函数 absolute-path?relative-path? 将 return #f 如果输入不是合法路径。

参见documentation