Why does Console.WriteLine() function miss some characters within a string?

杀马特。学长 韩版系。学妹 提交于 2019-12-09 07:48:33

问题


I have a string, declared as:

 string text = "THIS IS LINE ONE "+(Char)(13)+" this is line 2";

And yet, When I write Console.WriteLine(text);,

the output is:

this is line 2E

Why is this behaviour happening? Or is it because I'm being stupid and missing something obvious?

Why does it not print:

THIS IS LINE ONE [CR] //where the CR is a non printed character 
this is line 2

EDIT

Please note: this is NOT a 'how do I add a carriage return' question.


回答1:


(char)13 is a carriage return (To the left margin on the current line)

THIS IS LINE ONE \r this is line 2"

Is interpreted as:

Print THIS IS LINE ONE
then *return* and print this is line 2
The overlap is: E
So you see: this is line 2E




回答2:


This is how standard output on the console behaves.

  • "\n" ((Char)10) will move the caret to the start of the next line
  • "\r" ((Char)13) will move the caret to the start of the current line

As such, the results are thus the first line overwritten by the second line, leaving only the extra characters that the second line couldn't overwrite.

Since you've clarified that the string/characters have to be like that to get the behavior you want when this text is ultimately sent to the place you actually want to send it to, a dot matrix printer, then you need to test with the printer itself.

The above behavior is localized to the standard console. If you output the same characters to "standard output" but have redirected this to a printer, it is the printer's definition on how to deal with these characters that is important, and this may be different from the standard console.

As such, the behavior you see on the standard console is just that, the behavior of the standard console. You need to actually test with the printer to see how this behaves.




回答3:


If you want this behavior:

THIS IS LINE ONE [CR] //where the CR is a non printed character 
this is line 2

You need this code:

        char a = (char)10;
        string text = "THIS IS LINE ONE" + a + "this is line 2"

        Console.WriteLine(text);

A carriage return((Char) 13) is a control character or mechanism used to reset a device's position to the beginning of a line of text, because of that you experience this behavior. Like I said you need (char)13 for your case.




回答4:


"A carriage return, sometimes known as a cartridge return and often shortened to CR, or return, is a control character or mechanism used to reset a device's position to the beginning of a line of text." (source)

CR never changes a line, in fact it returns all the way to the beginning of "THIS IS LINE ONE " and prints " this is line 2" on top of it, hence why you see the additional E at the end of the sentence, as line one is one character longer. This is made clearer if you remove the two spaces from the two strings (last character of first string and first character of second string) where the output then becomes "this is line 2NE".

From the same source:

"It commands a printer, or other output system such as a display, to move the position of the cursor to the first position on the same line."

What you're looking for is not CR, but a combination of CR and LF (line feed): CRLF




回答5:


(Char)13 is a carriage return, while (Char)10 is a line feed. As others have said, this means that (Char)13 will return to the beginning of the line you are on, so that by the time you have written the (shorter) line 2, it will be written over the first section of the string - thus the remaining "E".

If you try it with a shorter second string, you can see this happening:

string text = "THIS IS LINE ONE " + (Char)13 +"test";
Console.WriteLine(text);

gives output:

"test IS LINE ONE"

Therefore, to solve your problem, the correct code will be:

string text = "THIS IS LINE ONE " + (Char)10 +"test";
Console.WriteLine(text);

which outputs:

THIS IS LINE ONE
this is line 2

Edit:

Originally, since you said your printer requires it to be a (Char)13, I suggested trying both (Char)10 + (Char)13 (or vice versa) to achieve a similar effect. However, thanks to Peter M's exceedingly helpful comments, it appears the brand of printer you are using does in fact require just a (Char)10 - according to the manual, (Char)10 will produce a line feed and a carriage return, which is what you require.




回答6:


The output isn't what it seems. Your terminal program is hiding you some characters of the bytes written in stdout because he interprets the carriage return presence as a text layout command (which is, go back to left). A hexdump can confirm that the output is correct by showing the very bytes of output.

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);
   }   
}

Compile and run :

$ 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



回答7:


Use string.Concat() to concatenate

string text = String.Concat(...)

and try to print this



来源:https://stackoverflow.com/questions/27192074/why-does-console-writeline-function-miss-some-characters-within-a-string

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!