如何解释在命令行参数的特殊字符用C?(How to interpret special charac

2019-08-17 00:41发布

第一个问题:

假设我们编写一个简单的程序,这需要在命令行参数,并打印到文件中。 如果用户输入

将writeToFile您好!0 \ NW%ORL \ t!@#y的

庆典与回复

!0:未找到事件。

如果没有用户不知道的东西喜欢用引号(“”)或转义字符(“\”),我怎么处理这个东西,而不是bash的理解它是一个命令?

第二个问题:

一旦我得到这些论点,我该如何将其解释为特殊字符,而不是字符序列。 (即\ t是选项卡,而不是 '\' 'T')

也就是说,如何确保程序写这文件:

Hello!0
 w%orl    !@#y

并不是

Hello!0\n w%orl\t!@#y

Answer 1:

关于第二个问题:作为@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<arglen; i++) {
    if (arg[i] == '\\') { // we've spotted an escape
        // interpret a backslash escape
        i++; // we should check for EOS here...
        switch (arg[i]) {
          case 'n': putchar('\n'); break;
          case 't': putchar('\t'); break;
          // etc
         }
     } else {
         // ordinary character: just output it
         putchar(arg[i]);
     }
 }

(插入错误处理和良好的作风,去味)。



Answer 2:

你不能得到的bash停止解析命令行的命令行。 你的具体情况, set +H将禁用历史扩展,从而使!0为文字,但如果你提供一个命令仍然失败(parenthesis)$variables#commentsampersand &壳语法等十多种元素。

请注意,这仅适用于外壳的解析过程,而不是被逐字地传递到任何数据execve或相似。

无论是让用户引用的数据( 'single quotes'是会照顾的,除了其他单引号),或使你的程序读取数据本身,这样的互动去

 $ writetofile Please enter your gibberish and press enter: Hello!0\nw%orl\t!@#y Thank you for your eloquent contribution. $ 


Answer 3:

第一个问题:使用单引号。 即:将writeToFile '您好!0 \ NW%ORL \ t @#Y'

问题二:用printf。



文章来源: How to interpret special characters in command line argument in C?