Подтвердить что ты не робот

Почему функция 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 'как добавить вопрос возврата каретки.

4b9b3361

Ответ 1

(char)13 - это каретка return (к левому краю в текущей строке)

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

Ответ 2

Вот как ведет себя стандартный вывод на консоли.

  • "\n" ((Char)10) переместит курсор в начало следующей строки
  • "\r" ((Char)13) переместит курсор в начало текущей строки

Таким образом, результаты, таким образом, являются первой строкой, перезаписываемой второй строкой, оставляя только лишние символы, которые вторая строка не может перезаписать.

Поскольку вы выяснили, что строка/символы должны быть такими, чтобы получить нужное поведение, когда этот текст в конечном итоге отправляется в место, на которое вы действительно хотите отправить его, точечный матричный принтер, тогда вам нужно тест с самим принтером.

Вышеуказанное поведение локализовано на стандартной консоли. Если вы выводите одни и те же символы в "стандартный вывод", но перенаправили это на принтер, это определение принтера о том, как справляться с этими важными символами, и это может отличаться от стандартной консоли.

Таким образом, поведение, которое вы видите на стандартной консоли, - это просто поведение стандартной консоли. Вам нужно протестировать принтер, чтобы узнать, как это происходит.

Ответ 3

Если вам нужно это поведение:

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) является управляющим символом или механизмом, используемым для reset позиции устройства в начале строки текста, из-за этого вы испытываете такое поведение. Как я уже сказал, вам нужно (Char) 13 для вашего дела.

Ответ 4

"Возвращение каретки, иногда называемое возвратом картриджа, и часто сокращенный до CR или возврат, является управляющим символом или механизмом используется для reset позиции устройства в начале строки текста." (источник)

CR никогда не меняет строку, на самом деле она возвращается полностью к началу "THIS IS LINE ONE " и печатает " this is line 2" поверх нее, поэтому вы видите дополнительный E в конце предложения, так как строка одна на один символ длиннее. Это становится яснее, если вы удалите два пробела из двух строк (последний символ первой строки и первый символ второй строки), где результат затем становится "this is line 2NE".

Из того же источника:

"Он управляет принтером или другой выходной системой, такой как дисплей, для переместите позицию курсора в первую позицию на том же линия".

То, что вы ищете, не CR, а комбинация CR и LF (строка): CRLF

Ответ 5

(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

Edit:

Первоначально, поскольку вы сказали, что ваш принтер требует, чтобы он был (Char) 13, я предложил попробовать как (Char)10 + (Char)13 (или наоборот) для достижения аналогичного эффекта. Однако, благодаря Петру М чрезвычайно полезные комментарии, кажется, что марка принтера, который вы используете, на самом деле требует всего (Char)10 - согласно руководство, (Char)10 будет выдавать строку и возврат каретки, что вам и нужно.

Ответ 6

вывод - это не то, что кажется. Ваша терминальная программа скрывает вас от некоторых символов байтов, написанных на 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

Ответ 7

Используйте string.Concat() для объединения

string text = String.Concat(...)

и попробуйте распечатать этот