【问题标题】:Interpreting '\n' in printf("%s", string)解释 printf("%s", string) 中的 '\n'
【发布时间】:2016-04-14 00:47:14
【问题描述】:

这段代码对我来说有点奇怪。拜托,有人愿意解释为什么吗?以及如何强制 '\n' 被解释为特殊字符?

beco@raposa:~/tmp/user/foo/bar$ ./interpretastring.x "2nd\nstr"
1st
str
2nd\nstr
beco@raposa:~/tmp/user/foo/bar$ cat interpretastring.c
#include <stdio.h>

int main(int argc, char **argv)
{
    char *s="1st\nstr";

    printf("%s\n", s);
    printf("%s\n", argv[1]);

    return 0;
}

底线,目的是将第二个字符串打印成两行,就像第一行一样。这个程序是一个简化。真正的程序在使用fgets 读取文件时存在问题(不是像这里那样对argv 的 S.O. 参数),但我认为在这里解决也会在那里解决。

【问题讨论】:

  • 反斜杠转义在 C 源代码 中很重要,但它们对 printffgets 和任何其他 C 运行时库函数都不重要。 shell 可能会将命令行参数的反斜杠转换为其他内容,但您不能指望这种情况发生,也不能指望它与 C 编译器对字符串文字所做的一致。如果您想将\n 转换为程序输入中的换行符,您必须自己手动完成。
  • 谢谢。非常中肯的评论。也许在庞大的 C 库中已经有了这样的功能?
  • 很遗憾的说没有这个功能。
  • 如果有人好奇,gcc.gnu.org/git/?p=gcc.git;a=blob;f=libcpp/charset.c#l1257 是 GCC 在字符串文字中实现反斜杠转义的核心。您还需要阅读子例程(向上滚动)和调用上下文(向下滚动)。
  • 与往常一样,如果您投反对票,请务必说明您认为这个问题值得回答的原因。基于此,我们可以编辑和改进问题。这就是使该站点非常适合搜索的原因。谢谢。

标签: c string printf


【解决方案1】:

shell 似乎无法识别和转换“转义序列”。使用支持\n转义序列的shell软件。

【讨论】:

  • 这个解决方案不能解决我的问题。我不希望第三方解释'\ n'。顺便说一句,我还评论了关于使用fgets()从文件中读取字符串的问题。
  • 因此您需要将文字 2 个字符 '\' 和 'n' 解释为单个换行符的代码,但您特别 想要第三方代码这样做?
  • 你不能要求我更改我的 API 来解决问题。我得到的字符串就是这样,就是这样。我必须在我自己的代码(或 C 库)中处理它。无论如何,这是一个简单的问题。我的问题更多的是关于是否有解释字符串的 C 库。
【解决方案2】:

出于所有目的,这只是处理\n 而没有其他字符得到特殊处理。

这里的答案以较低的复杂性完成了这项工作。它不会将“2 个字符”更改为“一个特殊的 \n”。它只是将&lt;\&gt;&lt;n&gt; 更改为“&lt;space&gt;&lt;newline&gt;”。没关系。如果有一个 C Standard Library 来解释字符串中的特殊 chars 会更好(我知道它有 RegExp 例如)。

/* change '\\n' into ' \n' */
void changebarn(char *nt)
{
    while(nt!=NULL)
        if((nt=strchr(nt,'\\')))
            if(*++nt=='n')
            {
                *nt='\n';
                *(nt-1)=' ';
            }
}

【讨论】:

  • 当然,现在您需要担心是否要将` followed by n` 作为文字而不是换行符传递。这意味着您需要允许反斜杠自行转义,因此您可以传递"foo\\nbar" 并获得foo\nbar 作为文字输出,带有反斜杠和n,而不是换行符。
  • 嗨@ShadowRanger,我在写这段代码之前就考虑过了。您的评论对于正在阅读此答案的人来说非常重要。至于我,我的输入没有文字"\\n"。我需要解释的唯一特殊字符只是'\n',而"\\n" 将被读取为&lt;\&gt;&lt; &gt;&lt;\n&gt;,没问题。不过,感谢您指出这一点。 +1。
猜你喜欢
  • 2015-02-15
  • 1970-01-01
  • 2016-07-20
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 2017-07-09
  • 1970-01-01
相关资源
最近更新 更多