为什么Console.WriteLine()函数会错过字符串中的某些字符?

时间:2014-11-28 15:46:36

标签: c# string console char console.writeline

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

 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'如何添加回车'问题。

7 个答案:

答案 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",而是CRCR(换行)的组合:CRLF

答案 4 :(得分:2)

(Char)13carriage 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(...)

并尝试打印此