如何解释C中命令行参数中的特殊字符?
第一个问题:
假设我们编写一个简单的程序,它接受命令行参数并打印到文件中。 如果用户输入
writetofile你好!0 \ nw%orl \ t!@#y
bash回复
!0:未找到事件。
如果用户不知道使用引号(”)或转义字符(’\’),我该如何处理这些东西而不是bash将其理解为命令?
第二个问题:
一旦我得到这些参数,我如何将它们解释为特殊字符而不是字符序列。 (即。\ t是标签,而不是’\”’)
也就是说,如何确保程序将其写入文件:
Hello!0 w%orl !@#y
并不是
Hello!0\nw%orl\t!@#y
关于第二个问题:正如@Jims所说,你可以使用printf(1)打印字符串。 好主意,但请注意,这只会因为(看起来)想要识别的转义,如\t
和\n
,与printf识别的转义相同。
这些转义是常见的,但它们并没有什么根本性,所以你的问题的一般答案 – 如果你想识别printf没有的转义的答案 – 是你的程序解释它们。 类似C的代码就是这样的:
char *arg = "foo\\tbar\\n"; /* the doubled backslashes are to make this valid C */ int arglen = strlen(arg); for (i=0; i
(插入error handling和良好的风格,品味)。
你不能让bash停止将命令行解析为命令行。 在您的特定情况下, set +H
将禁用历史记录扩展,从而允许!0作为文字,但如果您包括(parenthesis)
, $variables
,# #comments
, ampersand &
其他一些shell语法元素,命令仍然会失败。
请注意,这仅适用于shell的解析阶段,而不适用于字面上传递给execve
或类似的任何数据。
要么让用户引用数据( 'single quotes'
将处理除了其他单引号之外的所有内容),要么让程序读取数据本身以便交互进行
$ writetofile Please enter your gibberish and press enter: Hello!0\nw%orl\t!@#y Thank you for your eloquent contribution. $
第一个问题:使用单引号。 即:writetofile’Hello!0 \ nw%orl \ t!@#y’
第二个问题:使用printf。