ultimos - string c# ejemplos
¿Por qué la función Console.WriteLine() pierde algunos caracteres dentro de una cadena? (7)
Tengo una cadena, declarada como:
string text = "THIS IS LINE ONE "+(Char)(13)+" this is line 2";
Y, sin embargo, cuando escribo Console.WriteLine(text);
,
la salida es:
this is line 2E
¿Por qué está sucediendo este comportamiento? ¿O es porque estoy siendo estúpido y me falta algo obvio?
¿Por qué no se imprime?
THIS IS LINE ONE [CR] //where the CR is a non printed character
this is line 2
EDITAR
Tenga en cuenta: esta NO es una pregunta ''¿cómo agrego un retorno de carro''?
Así es como se comporta la salida estándar en la consola.
-
"/n"
((Char)10
) moverá el cursor al comienzo de la línea siguiente -
"/r"
((Char)13
) moverá el cursor hacia el inicio de la línea actual
Como tal, los resultados son, por lo tanto, la primera línea sobrescrita por la segunda línea, dejando solo los caracteres adicionales que la segunda línea no pudo sobreescribir.
Ya que ha aclarado que la cadena / caracteres tienen que ser así para obtener el comportamiento que desea cuando este texto finalmente se envía al lugar donde realmente desea enviarlo, una impresora matricial, entonces debe probar con el la propia impresora.
El comportamiento anterior está localizado en la consola estándar. Si emite los mismos caracteres a "salida estándar" pero los ha redirigido a una impresora, es la definición de la impresora sobre cómo tratar estos caracteres lo que es importante, y esto puede ser diferente de la consola estándar.
Como tal, el comportamiento que ves en la consola estándar es solo eso, el comportamiento de la consola estándar. Debe probar con la impresora para ver cómo se comporta.
La salida no es lo que parece. Su programa de terminal le está ocultando algunos caracteres de los bytes escritos en stdout porque interpreta la presencia de retorno de carro como un comando de diseño de texto (que es, regrese a la izquierda). Un hexdump puede confirmar que la salida es correcta al mostrar los mismos bytes de salida .
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);
}
}
Compilar y ejecutar:
$ 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
(Char)13
es un retorno de carro , mientras que (Char)10
es un avance de línea. Como han dicho otros, esto significa que (Char) 13 volverá al comienzo de la línea en la que se encuentra, de modo que cuando haya escrito la línea (más corta) 2, se escribirá sobre la primera sección de la cadena. - por lo tanto, la "E" restante.
Si lo intenta con una segunda cuerda más corta, puede ver que esto sucede:
string text = "THIS IS LINE ONE " + (Char)13 +"test";
Console.WriteLine(text);
da salida:
"test IS LINE ONE"
Por lo tanto, para resolver su problema, el código correcto será:
string text = "THIS IS LINE ONE " + (Char)10 +"test";
Console.WriteLine(text);
qué salidas:
THIS IS LINE ONE
this is line 2
Editar:
Originalmente, como dijiste que tu impresora requiere que sea un (Char) 13, sugerí probar ambos (Char)10 + (Char)13
(o viceversa) para lograr un efecto similar. Sin embargo, gracias a los comentarios sumamente útiles de Peter M, parece que la marca de la impresora que está utilizando requiere de hecho solo un (Char)10
- de acuerdo con el manual , (Char)10
producirá un avance de línea y un retorno de carro, que es lo que necesitas
(char)13
es un retorno de carro (al margen izquierdo en la línea actual)
THIS IS LINE ONE /r this is line 2"
Se interpreta como:
Print THIS IS LINE ONE
then *return* and print this is line 2
The overlap is: E
So you see: this is line 2E
Si quieres este comportamiento:
THIS IS LINE ONE [CR] //where the CR is a non printed character
this is line 2
Necesitas este código:
char a = (char)10;
string text = "THIS IS LINE ONE" + a + "this is line 2"
Console.WriteLine(text);
Un retorno de carro ((Char) 13) es un carácter o mecanismo de control utilizado para restablecer la posición de un dispositivo al comienzo de una línea de texto, debido a que experimenta este comportamiento. Como dije, necesitas (char) 13 para tu caso.
Utilice string.Concat()
para concatenar
string text = String.Concat(...)
e intenta imprimir esto
"Un retorno de carro, a veces conocido como retorno de cartucho y, a menudo, abreviado como CR o retorno, es un carácter o mecanismo de control que se utiliza para restablecer la posición de un dispositivo al comienzo de una línea de texto". (fuente)
CR
nunca cambia una línea, de hecho regresa todo el camino hasta el comienzo de "THIS IS LINE ONE "
e imprime " this is line 2"
en la parte superior, por lo tanto, ¿por qué ves la E
adicional al final de la oración? como la línea uno es un personaje más largo. Esto se hace más claro si elimina los dos espacios de las dos cadenas (último carácter de la primera cadena y primer carácter de la segunda cadena) donde la salida se convierte en "this is line 2NE"
.
De la misma fuente:
"Le ordena a una impresora u otro sistema de salida, como una pantalla, mover la posición del cursor a la primera posición en la misma línea".
Lo que está buscando no es CR
, sino una combinación de CR
y LF
(alimentación de línea): CRLF