我有一个字符串,声明为:
string text = "THIS IS LINE ONE "+(Char)(13)+" this is line 2";
然而,当我写Console.WriteLine(text);
时,
输出是:
this is line 2E
为什么会发生这种情况?或者是因为我愚蠢而且缺少一些明显的东西?
为什么不打印:
THIS IS LINE ONE [CR] //where the CR is a non printed character
this is line 2
修改
请注意:这是不 a'如何添加回车'问题。
答案 0 :(得分:58)
(char)13
是返回(到当前行的左边距)
THIS IS LINE ONE \r this is line 2"
被解释为:
Print THIS IS LINE ONE
then *return* and print this is line 2
The overlap is: E
So you see: this is line 2E
答案 1 :(得分:20)
这是控制台上的标准输出行为。
"\n"
((Char)10
)会将插入符号移到下一行的开头"\r"
((Char)13
)会将插入符号移至当前行的开头因此,结果是第二行覆盖的第一行,只留下第二行无法覆盖的额外字符。
因为你已经澄清了字符串/字符必须像那样才能获得你想要的行为,当这个文本最终被发送到实际想要发送给它的地方时,一个点矩阵打印机,然后你需要用打印机本身进行测试。
以上行为已本地化为标准控制台。如果您将相同的字符输出到“标准输出”但已将其重定向到打印机,则打印机的定义是如何处理这些重要的字符,并且此可能与标准不同控制台。
因此,您在标准控制台上看到的行为就是标准控制台的行为。您需要使用打印机进行实际测试以查看其行为。
答案 2 :(得分:5)
如果您需要此行为:
THIS IS LINE ONE [CR] //where the CR is a non printed character
this is line 2
您需要以下代码:
char a = (char)10;
string text = "THIS IS LINE ONE" + a + "this is line 2"
Console.WriteLine(text);
回车符((字符)13)是用于将设备的位置重置为一行文本开头的控制字符或机制,因为您会遇到此行为。就像我说的那样你需要(char)13。
答案 3 :(得分:3)
“回车,有时也称为硒鼓返回 缩写为CR或返回,是一个控制字符或机制 用于将设备的位置重置为一行文本的开头。“(source)
CR
永远不会更改一行,实际上它会一直返回到"THIS IS LINE ONE "
的开头并在其上打印" this is line 2"
,因此您会看到额外的{{1在句子的末尾,第一行是一个字符更长。如果从两个字符串(第一个字符串的最后一个字符和第二个字符串的第一个字符)中删除两个空格,然后输出变为E
,则会更清楚。
来自同一来源:
“它命令打印机或其他输出系统,如显示器 将光标的位置移动到同一个位置的第一个位置 线“。
您要找的不是"this is line 2NE"
,而是CR
和CR
(换行)的组合:CRLF
答案 4 :(得分:2)
(Char)13
是carriage return,而(Char)10
是换行符。正如其他人所说,这意味着(Char)13将返回到您所在行的开头,因此当您编写(较短的)第2行时,它将被写入字符串的第一部分 - 因此剩下的" E"。
如果您使用较短的第二个字符串进行尝试,您可以看到这种情况发生:
string text = "THIS IS LINE ONE " + (Char)13 +"test";
Console.WriteLine(text);
给出输出:
"test IS LINE ONE"
因此,要解决您的问题,正确的代码将是:
string text = "THIS IS LINE ONE " + (Char)10 +"test";
Console.WriteLine(text);
输出:
THIS IS LINE ONE
this is line 2
编辑:
最初,既然你说你的打印机要求它是(Char)13,我建议尝试(Char)10 + (Char)13
(反之亦然)以达到类似的效果。但是,感谢Peter M非常有用的评论,看来您使用的打印机品牌实际上只需要(Char)10
- 根据the manual,(Char)10
会产生换行和回车,这是你需要的。
答案 5 :(得分:2)
输出并不是它的样子。您的终端程序隐藏了stdout中写入的字节的一些字符,因为他将回车状态解释为文本布局命令(即,返回到左侧)。通过显示输出的字节,hexdump可以确认输出是正确的。
using System;
public class Hello1 {
public static void Main() {
string text = "THIS IS LINE ONE "+(Char)(13)+" this is line 2";
System.Console.WriteLine(text);
}
}
编译并运行:
$ gmcs a.cs
$ ./a.exe
this is line 2E
$ ./a.exe | hexdump -C
00000000 54 48 49 53 20 49 53 20 4c 49 4e 45 20 4f 4e 45 |THIS IS LINE ONE|
00000010 20 0d 20 74 68 69 73 20 69 73 20 6c 69 6e 65 20 | . this is line |
00000020 32 0a |2.|
00000022
答案 6 :(得分:-2)
使用string.Concat()
连接
string text = String.Concat(...)
并尝试打印此