22

我有一个字符串,声明为:

 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

编辑

请注意:这不是“如何添加回车”问题。

4

7 回答 7

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

于 2014-11-28T16:06:33.907 回答
20

这就是控制台上标准输出的行为方式。

  • "\n"( (Char)10) 将插入符号移动到下一行的开头
  • "\r"( (Char)13) 将插入符号移动到当前行的开头

因此,结果是第一行被第二行覆盖,只留下第二行无法覆盖的额外字符。

既然您已经澄清字符串/字符必须是这样才能获得您想要的行为,当此文本最终发送到您实际想要发送到的地方时,点阵打印机,那么您需要测试打印机本身。

上述行为已本地化到标准控制台。如果您将相同的字符输出到“标准输出”但已将其重定向到打印机,那么打印机对如何处理这些字符的定义很重要,这可能与标准控制台不同。

因此,您在标准控制台上看到的行为就是标准控制台的行为。您需要使用打印机进行实际测试以查看其行为方式。

于 2014-11-28T16:05:59.443 回答
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);

回车((Char) 13) 是一个控制字符或机制,用于将设备的位置重置为文本行的开头,因为您会遇到这种行为。就像我说的那样,您的情况需要 (char)13。

于 2014-11-28T16:03:42.393 回答
3

“回车,有时称为墨盒回车,通常缩写为 CR 或回车,是用于将设备位置重置为文本行开头的控制字符或机制。” (资源)

CR从不更改一行,实际上它一直返回到开头"THIS IS LINE ONE "并在其顶部打印" this is line 2",因此为什么您会E在句子末尾看到附加内容,因为第一行是一个字符长。如果从两个字符串(第一个字符串的最后一个字符和第二个字符串的第一个字符)中删除两个空格,则输出变为"this is line 2NE".

来自同一来源:

“它命令打印机或其他输出系统(如显示器)将光标的位置移动到同一行的第一个位置。”

您要查找的不是CR,而是CRand的组合LF(换行):CRLF

于 2014-11-28T16:35:44.923 回答
2

(Char)13回车(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- 根据手册(Char)10将产生换行符和回车符,这正是您所需要的。

于 2014-11-28T16:10:00.340 回答
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
于 2014-11-28T21:05:59.717 回答
-2

用于string.Concat()连接

string text = String.Concat(...)

并尝试打印这个

于 2014-11-28T15:56:12.013 回答