【问题标题】:C - '\n' character not printing new lineC - '\n' 字符不打印新行
【发布时间】:2015-09-26 16:12:53
【问题描述】:

我将“abc\n”之类的字符串传递给程序,该程序将字符串存储在缓冲区中,然后打印传入的内容。

像这样:

int main(int argc, char **argv) {
   char buffer[5];
   strncpy(buffer, argv[1], 5);
   printf("%s", buffer);

   return 0;
}

我的论点是这样的:"abc\n"

然后打印出来的字符串是这样的:abc\n

abc后面怎么不加新行?

【问题讨论】:

    标签: c string character buffer newline


    【解决方案1】:

    它打印abc\n 的原因是shell 没有进行C 风格的转义,即shell 中的\n 不是转义的换行符。 shell 生成的内容是在您的 C 程序中作为参数传递给 main 的内容。

    char * str = "abc"; 与 shell 终端中的foo abc\n 的行为完全不同。前者由C标准规定,后者可能因shell而异。

    究竟如何修复它,取决于您的平台,以及您使用的外壳,这并不是一个真正的C 问题。

    您可能想准确解释您要做什么,然后您可以考虑是手动实现某些字符转义组合,还是使用不同的输入法。

    这是关于 coliru 的代码示例:http://coliru.stacked-crooked.com/a/111f9fdd28219f88

    (这里是代码和命令行:)

    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char **argv) {
       char buffer[5];
       strncpy(buffer, argv[1], 5);
       printf("%s", buffer);
    
       return 0;
    }
    

    g++ -O3 -std=c++11 -Wall -Werror main.cpp && ./a.out "asd\n"

    asd\n

    【讨论】:

    • 我明白了,谢谢。我正在使用 GCC 编译器,我认为我的 shell 不是 bash,而是常规的 sh。
    • @Ikshvaku:没关系——bash 和普通的 sh 都不会解释字符串中的反斜杠(\ )转义。所以\n 将是两个字符。在引号之外,\ 对 shell 具有特殊含义,但与 C 字符串中的含义不同,因此它在那里也不起作用。但是,您可以在 sh 和 bash 中的字符串中包含实际的换行符——键入 ./a.out "asd 并按回车键,您会得到一个继续提示(通常是 &gt;),并且您可以为同一命令输入更多文本。输入 " 并立即回车,它会在参数中使用换行符调用您的程序。
    • 注意; strncpy(buffer, "abc\\n", 5); printf("%s", buffer); 是 UB,因为 buffer 缺少空字符。
    【解决方案2】:

    当您从命令行传入“abc\n”时,您将传入一个文字“\”,后跟一个文字“n”,这就是您正在做的事情。

    当你在程序中定义一个字符串为

    char *myString = "abc\n";
    

    “\n”在编译时被转换为换行符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      相关资源
      最近更新 更多