如何解释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 ,# #commentsampersand &其他一些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。