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

时间:2016-08-12 05:12:41

标签: scheme 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 "

这样做的最佳方式是什么?

2 个答案:

答案 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,我的建议是至少要学习它的主要功能,以加快程序的开发。