【问题标题】:strings one after the other in c : "...""...", as if they were concatenate在 c 中一个接一个的字符串:“...”“...”,就好像它们是连接的
【发布时间】:2025-12-27 09:00:06
【问题描述】:

我正在编写一个不是我编写的 c 代码,并且有很多这样的 fprintf 调用:

fprintf(file, "blabla1""blabla2%s""blabla3", mystring);

我从未见过我们可以在 fprintf 的第二个参数中放入多个字符串,这是一种连接吗?或者这是 fprintf 的一个特性?如果是这样,fprintf 的规范中没有提到吗?

【问题讨论】:

    标签: c string concatenation printf


    【解决方案1】:

    这是字符串文字的特性,如果它们相邻,它们将被连接起来。如果我们查看 draft C99 standard 部分 6.4.5 字符串文字第 4 段 说:

    在翻译阶段 6,由任意序列指定的多字节字符序列 相邻字符和宽字符串文字标记连接成单个多字节 字符序列。 如果任何标记是宽字符串文字标记,则生成的 多字节字符序列被视为宽字符串文字;否则,将其视为字符串文字。

    正如 Lundin 指出的,可以在5.1.1.2 部分找到更简单的引述翻译阶段第 6 段

    连接相邻的字符串文字标记。

    【讨论】:

    • “翻译阶段 6”在 C11 5.1.1.2/6:Adjacent string literal tokens are concatenated.
    • @Lundin Huh,这是一个更直接的引用,感谢您指出,C99 中也存在相同的引用。
    【解决方案2】:

    不,这不是fprintf() 的功能,这是不可能的(您自己如何实现这样的功能?)因为fprintf() 只是一个标准功能,编译器没有额外的魔法。

    这是 C 语法的一个特点:相邻的字符串文字只需将它们连接在一起即可被视为单个文字。

    例如,它与preprocessor's stringification support 一起非常有用。

    【讨论】:

      【解决方案3】:

      在您显示的代码中,只有一种格式代码:"%s"。它接受 mystring 中包含的值,因此结果将是:“blablablabla2_contents of mystring_blabla3”

      是的,这是合法代码。我不知道为什么有人会这样做。

      【讨论】:

        【解决方案4】:

        我会依次回答每个问题。

        • 这是一种串联吗?

        你一针见血。确实是的。

        • 或者这是 fprintf 的一个特性?

        不,只是 C 语法的一部分。

        • 如果是这样,fprintf的规范中没有提到?

        这实际上不是一个问题,尽管有标点符号,但你可能是正确的,fprintf 规范没有提到这种类型的连接,这是因为它是语言的一部分,而不是特定的功能。

        【讨论】:

          最近更新 更多