C 中是否有 \n 的替代品?我可以不使用 \n 跳到下一行吗?我遇到了这个问题,我似乎无法想出办法..
#include < stdio.h>
void main()
{
printf("A");
printf("B");
}
我要打印
A
B
并不是
AB
但我不能使用\n。
您可以使用puts("A"); puts("B");
.
要在\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
作为 的替代方法puts()
,您可以使用 : 的八进制等效\n
项\012
。
例如
#include <stdio.h>
int main()
{
printf("A\012");
printf("B\012");
return 0;
}
\n
意思是“新行”。\r
意思是“回车”。这些字符起源于旧的换页打印机,它需要两者,一个将纸张推进到新行,一个将带有打印头的托架返回到行首。
不同的操作系统使用两者的不同组合来指示文本中的新行:
\n
\r\n
\r
C 标准库中没有规范的平台无关方式来表示“系统”的换行符/回车符。但是,许多其他语言和/或库已经实现了这一点,例如:
System.getProperty("line.separator")
System.Environment.NewLine
但是,如果您在文本文件上打开了输出流,则标准 C 库应转换\n
为在当前系统上指示新行所需的任何内容。
我会简单地使用:
printf("A%cB",10);
在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。