除了\ n之外的C中的换行符?

时间:2013-09-08 20:00:07

标签: c newline

C中是否有替换\ n?我可以在不使用\ n的情况下跳转到下一行吗?我遇到了这个问题,我似乎无法找到方法......

#include < stdio.h>

void main()
{
   printf("A");
   printf("B");
}

我希望它打印

A
B

而不是

AB

但我不能使用\ n。

6 个答案:

答案 0 :(得分:4)

您可以使用puts("A"); puts("B");

答案 1 :(得分:3)

要在不编写\n的情况下输出\n,您可以简单地printf("%c",10);char c=10;write(1,&c,1);或其他100种方式输出ascii 10.

但如果您想完全避免换行符,答案会有所不同。它不是C或您的代码实际上决定转到新行,但无论设备是什么显示您的输出。

E.g。终端,行式打印机或显示html的Web浏览器。

假设您正在输出到浏览器,答案将是&lt; br&gt;

如果要输出到xterm终端,\ 033 [1B将光标向下移动一行。输出回车\ r \ n移动到行的开头。

例如:

printf("test\033[1B\r123");

将输出(在xterm中)

test
123

答案 2 :(得分:2)

作为puts()的替代方案,您可以使用等同于\n的八进制:\012

E.g。

#include <stdio.h>
int main()
{
    printf("A\012");
    printf("B\012");
    return 0;
}

答案 3 :(得分:2)

\n表示“新行”。 \r表示“回车”。这些字符源自旧的换页打印机,它们需要两个,一个用于将纸张前进到一个新行,一个用于将带有打印头的滑架返回到行的开头。

不同的操作系统使用两者的不同组合来表示文本中的新行:

  • Unix(以及Linux,Mac OSX等)仅使用\n
  • Windows使用\r\n
  • Mac OS版本9仅使用\r

C标准库中没有与规范平台无关的方式来表示“系统”的换行符/回车符。但是,许多其他语言和/或库已经实现了这一点,例如:

  • Java:System.getProperty("line.separator")
  • .NET:System.Environment.NewLine

但是,如果您在文本文件上打开了输出流,则标准C库应将\n转换为指示当前系统上新行所需的任何内容。

答案 4 :(得分:1)

我只是使用:

printf("A%cB",10);

答案 5 :(得分:1)

C 中,转义序列\n表示属于基本执行字符集的字符。

  • 特别是,当我们的C程序运行时,可以确定存在换行符。

  • 更重要的是:\n映射到1且只有1个字符,其代码是char类型范围内的正整数。

然而,显示设备的行为可以产生其他结果 例如,当我们将一个字符\n发送到Windows下的文本文件时,它将被两个字符的序列\ x0D \ x0A(LF + CR,即:换行+回车)替换。

标准C99或C11表示:

  

(5.2.2)\ n(新行)将活动位置移动到下一行的初始位置。

其含义(在每个在其标准显示设备中打印多行的系统中),发送字符\n的“效果”是“前进到下一行”和“转到开头的那条线“。它是“换行”和“回车”操作的总和。

  • 在DOS / Windows中,这相当于发送这两个字符的序列:'\ xD','\ xA'。

  • 在Linux / Unix中,这相当于发送唯一的字符'\ xD'。

此处有更多详情:http://en.wikipedia.org/wiki/Newline

总结一下,我们必须区分字符\n本身,以及与\n相关的语义何时被视为C中的控制字符。


只需发送带有'\n'putc()的字符printf()即可“生成”新行。
使用\n是更好的方法。

另一个非常好的选择是@ 1''指出:使用函数puts(str)。
此函数在字符串str的末尾附加一个换行符。


我认为尝试其他替代方案并不是一个好主意:

printf("%c", 10); // 10 == 0x0A
printf("%c", 13); // 10 == 0x0D
printf("\x0A");   // CR
printf("\x0D");   // LF

您没有正确解决问题,因为您的程序依赖于系统 适用于Windows,Linux还是什么?

最糟糕的是:从理论上讲,标准 C 并不能确保您的字符的ASCII / Unicode代码编号与程序运行的系统中使用的字符之间的对应关系。此问题也涉及控制字符。

因此,您不能确定0x10表示“回车”而0x13表示“换行” 为了确保这一点,有必要检查以下宏的存在:

 __STDC_ISO_10646__

(该宏(如果存在)是一个long int数字,其中包含有关编译器支持的Unicode版本的信息。)

重要的是:如果未定义宏__STDC_ISO_10646__,则无法确定分配给系统中字符的代码。
因此,它不能使用“魔数”10和13.