双反斜杠和单反斜杠在命令行上导致相同的字符串

时间:2019-02-02 10:51:32

标签: bash

int main(int argc, char **argv) {
char *str;
str = argv[1]; 
printf("%s", str);
return 0; }

使用以下两个字符串执行程序时:

$./program "\abc"
$./program "\\abc"

两次运行都将与str相同的字符串存储在str = \\abc变量中。

在使用\\abc运行时如何获得四个反斜杠,或者在使用\abc运行时如何获得一个反斜杠?

2 个答案:

答案 0 :(得分:1)

您将永远不会从\\得到四个反斜杠,但是如果您想按字面地传递字符串,请使用single quotes

  

将字符括在单引号(')中可保留引号内每个字符的字面值。即使在前面加上反斜杠,也不能在单引号之间引起单引号。

例如:

./program '\abc'   # passes a four-character string: \ a b c
./program '\\abc'  # passes a five-character string: \ \ a b c

答案 1 :(得分:0)

我假设您正在控制台中使用Bash。您的问题与C无关,与 Bash 如何处理字符串无关。根据{{​​1}}:

  

用双引号引起来的字符会保留所有引号内的字符的字面值,但$,`,\和启用历史记录扩展的字符除外!当外壳处于posix模式时,!没有特殊的双引号的含义,就是使历史扩展时也是如此。字符$和`在双引号中保留其特殊含义。 反斜杠仅在其后跟以下字符之一时保留其特殊含义:$,`,“,\或换行符。。双引号中的双引号可能会在反引号前加上反斜杠。如果启用,将执行历史记录扩展,除非使用反斜杠将双引号引起的!进行转义。不删除!之前的反斜杠。

因此在Bash中,man"\a"都被视为与“ \ a”相同。如果要在双引号中包含四个反斜杠,则需要编写其中的8个。尝试"\\a"