0

C 中是否有 \n 的替代品?我可以不使用 \n 跳到下一行吗?我遇到了这个问题,我似乎无法想出办法..

#include < stdio.h>

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

我要打印

A
B

并不是

AB

但我不能使用\n。

4

6 回答 6

4

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

于 2013-09-08T20:07:17.067 回答
3

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

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

例如,终端、行式打印机或显示 html 的 Web 浏览器。

假设您要输出到浏览器,答案将是 <br>

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

例如:

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

将输出(在 xterm 中)

test
123
于 2013-09-08T20:09:13.053 回答
2

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

例如

#include <stdio.h>
int main()
{
    printf("A\012");
    printf("B\012");
    return 0;
}
于 2013-09-08T20:09:41.787 回答
2

\n意思是“新行”。\r意思是“回车”。这些字符起源于旧的换页打印机,它需要两者,一个将纸张推进到新行,一个将带有打印头的托架返回到行首。

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

  • Unix(和 Linux、Mac OSX 等)仅使用\n
  • 视窗使用\r\n
  • 最高版本 9 的 Mac OS 仅使用\r

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

  • 爪哇:System.getProperty("line.separator")
  • 。网:System.Environment.NewLine

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

于 2013-09-08T20:12:32.000 回答
1

我会简单地使用:

printf("A%cB",10);

于 2013-09-08T20:11:07.910 回答
1

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

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

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

但是,显示设备的行为可能会产生其他结果。
比如我们\n在windows下给文本文件发送一个字符,这个替换为两个字符的序列\x0D\x0A(LF+CR,即:换行+回车)。

标准 C99 或 C11 说:

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

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

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

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

更多细节在这里:http ://en.wikipedia.org/wiki/Newline

综上所述,我们必须单独区分字符\n,而与when相关的语义\n在C中被视为控制字符。


您可以通过'\n'使用putc()or发送字符来“生成”一个新行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。

于 2013-09-08T23:03:07.610 回答