【问题标题】:printf ignores single backslash '\'printf 忽略单个反斜杠 '\'
【发布时间】:2012-06-28 12:01:39
【问题描述】:

我有这个代码:

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

如果我以a.out a\=b= 运行此代码。我正在使用C-shell

它的输出是“a=b=”有什么办法可以把它的输出改成“a\=b=”。

【问题讨论】:

  • 你大大改变了问题。之前是关于 C 中字符串的问题,现在是如何在 shell 的命令行中输入字符串的问题。

标签: c string printf


【解决方案1】:

已编辑问题的更新

用引号将你的命令行参数括起来:

  $ a.out "a\=b="

引号会阻止 shell 以任何方式解释命令行参数,所以只有这个字符串被传递给你的程序。我使用csh/bash ..两者都可以。

或者,您可以用另一个“转义”\ 并跳过双引号:

  $ a.out a\\=b=

原始问题的先前答案

是的,使用两个\

char a[]="a\\=b=";

输出:

a\=b=

解释

\ 是一个转义字符,用于表示特殊字符序列,例如\t 表示一个制表符。如果你想实际打印\t,你需要用另一个\“转义”这个\。看这个例子和输出:

printf("\t-->Hi\n");    /* print regular tab via \t                        */
printf("\\t-->Hi\n");   /* want to print "\t", not tab  ..so we use two \\ */

导致:

    -->Hi
\t-->Hi

不是printf() 函数独有的,也不是真正的 C 语言,可能语言使用反斜杠来指示字符串中的“转义序列”。

【讨论】:

  • 怎么做?我可以写一个可以将"a\=b="转换为"a\\=b="的代码
  • @nav_jan 不确定我是否理解你的问题——即使你放了两个反斜杠,printf 也会正确解释它并在输出中生成一个。
【解决方案2】:

printf() 不会忽略您的单个反斜杠,这是解析 C 字符串的方式。反斜杠是一个 转义 字符,表示一些不容易在字符串中输入的字符,例如换行符 (\n) 或嵌入的引号 (\")。因此,要包含反斜杠,您必须包含 两个 反斜杠 (\\)。这适用于所有字符串,与printf() 无关。

【讨论】:

  • 怎么做?我可以写一个可以将"a\=b="转换为"a\\=b="的代码
  • 因为您有很多地方并且想要更改它们?听起来像是搜索+替换或正则表达式的工作。
  • 不,我正在从命令行a.out a\=b= 提供字符串,我想打印 argv[1]。
  • 从 shell 输入的字符串不会被 C 以这种方式解释。然而,它可能被你的shell解释。不过,要确定,我们需要知道您使用的是哪个 shell。
  • c-shell 确实会解释反斜杠,除非您引用或转义它,a\\=b"a\=b"'a\=b' 中的任何一个都应该工作。
【解决方案3】:

\ 是 C 中字符串中的转义字符。您可以使用它来访问特殊字符,例如换行符 (\n)。如果你想以字符的形式访问\,你也需要转义它:\\

【讨论】:

  • 怎么做?我可以写一个可以将"a\=b="转换为"a\\=b="的代码
  • @nav_jan 不,如果你想显示\ ,只需输入\\
  • 如果我从命令行a.out a\=b= 给出字符串并且我想打印 argv[1]
【解决方案4】:

\\ 是在 C 中读作 \ 的内容

\ 是 C 中字符或字符串中唯一用于表示其他字符或字符串的字符。这就是名称“转义”字符的含义。

因为它是以这种方式使用的,所以有必要将反斜杠本身包含在这种序列可指示的符号之一中。

其他一些序列是: \n 换行 \t 制表符 \v 垂直制表符 \警铃响起

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-25
    • 2021-08-17
    • 2018-05-19
    • 2010-12-14
    • 2010-09-11
    • 2012-06-16
    • 1970-01-01
    相关资源
    最近更新 更多