使用printf而不必转义双引号?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用printf而不必转义双引号?相关的知识,希望对你有一定的参考价值。

在C中,通常不可能将'用于字符串的printf。但是,我的文字充满了双引号",我需要将它们全部转义为

printf("This is "test" for another "text"");

有没有可能在没有逃离printf的情况下"。我的意思是使用另一个字符来包装字符串。

答案

不推荐,但您可以使用宏:

#include <stdio.h>
#define S(x) #x

int main() {
    printf(S(This "is" a string (with nesting)!
));
}

这打印

This "is" a string (with nesting)!

现在分隔符是平衡的()字符。然而,要逃避单个)"'角色,你必须写一些类似S(right paren: ) ")" S(! ),这是非常难看的。建议不要将此技术用于编写可维护代码。

另一答案

不,这在C语言中是不可能的。字符串文字只有一种语法,那就是它们用双引号分隔。

编写未转义引号的唯一方法是作为字符数组中的字符文字,这样更难以编写,因此在这种情况下没有理由这样做:

char array[] = {'T', 'h', 'i', 's', ' ', 'i', 's', ' ', '"'};  // etc.
printf("%s", array);
另一答案

没有其他方法,draft C99 standard部分的6.4.5 String literals具有以下语法:

string-literal:
  " s-char-sequenceopt "
  L" s-char-sequenceopt "
另一答案

不,在标准C中不可能。

C11 6.4.5字符串文字

相同的注意事项适用于字符串文字中序列的每个元素,就好像它是整数字符常量(对于字符或UTF-8字符串文字)或宽字符常量(对于宽字符串文字),除了单引号'可以单独表示,也可以由转义序列表示,但双引号“应由转义序列表示”。

另一答案

首先,将程序的要求与解决方案分开以满足这些要求。给出最小的信息量。在这个问题中,要求是使用C打印具有双引号的字符串。在C中有几种方法可以做到这一点。

例如,以下代码片段:

char string[] = "This string " has one double quote.";

printf("This string %cprints%c with %cdouble%c quotes", '"', '"', '"', '"');
printf("%s", string);

生产:

This string "prints" with "double" quotes.
This string " has one double quote.

您的应用程序可能有更多您未提及的要求,但它应该可以实现您想要的,而不是您最初认为应该完成的方式(欢迎来到“需求分析”的世界)。

另一答案

你可以避免逃避使用

printf(R"a SOME_STRING a"); // Note that 'a' can be any character.


/* Print dog without any escape. */
printf(R"a(|\_/|
|q p|   /}
( 0 )"""
|"^"`    |
||_/=\__|)a");
}

以上是关于使用printf而不必转义双引号?的主要内容,如果未能解决你的问题,请参考以下文章

C语言里如果要输出一个带有双引号的程序,应该在printf("***********")里怎样表示?

用R中的双引号替换转义的双引号

c语言中怎样在输出语句printf中输出双引号

在 Xpath 中同时转义双引号和单引号

C语言怎么输出“双引号”?

使用 TextFieldParser 处理包含未转义双引号的字段