stringtranslate.com

Secuencias de escape en C

En el lenguaje de programación C , una secuencia de escape es un texto delimitado especialmente en un carácter o cadena literal que representa uno o más caracteres para el compilador . Permite que un programador especifique caracteres que de otra manera serían difíciles o imposibles de especificar en un literal.

Una secuencia de escape comienza con una barra invertida ( \ ), llamada carácter de escape , y los caracteres subsiguientes definen el significado de la secuencia de escape. Por ejemplo, \n denota un carácter de nueva línea .

Las mismas secuencias de escape o secuencias similares se utilizan en otros lenguajes relacionados, como C++ , C# , Java y PHP .

Valor

Para demostrar el valor de la función de secuencia de escape, para generar el texto Foo en una línea y Bar en la siguiente, el código debe generar una nueva línea entre las dos palabras.

El código siguiente logra el objetivo mediante el formato de texto y un valor de carácter ASCII codificado de forma rígida para la nueva línea (0x0A). Esto se comporta como se desea con las palabras en líneas secuenciales, pero una secuencia de escape tiene ventajas.

#include <stdio.h> int main () { printf ( "Foo%cBar" , 0x0A ); devolver 0 ; }       

La secuencia de escape \n permite un código más corto al especificar la nueva línea en el literal de cadena y un tiempo de ejecución más rápido al eliminar la operación de formato de texto. Además, el compilador puede asignar la secuencia de escape a un sistema de codificación de caracteres distinto de ASCII y, de esta manera, hacer que el código sea más portátil .

#include <stdio.h> int main () { printf ( "Foo \n Bar" ); devolver 0 ; }      

Cómo funciona

Una secuencia de escape cambia la forma en que el compilador interpreta los datos de caracteres en un literal. Por ejemplo, \n no representa una barra invertida seguida de la letra n . La barra invertida permite escapar de la forma normal y literal en que el compilador interpreta los datos de caracteres. Después de una barra invertida, el compilador espera que los caracteres subsiguientes completen una de las secuencias de escape definidas y, luego, traduce la secuencia de escape a los caracteres que representa.

Esta sintaxis requiere un manejo especial para codificar un carácter de barra invertida, ya que es un metacarácter que cambia el comportamiento de interpretación literal, no el carácter de barra invertida literal. El problema se resuelve utilizando dos barras invertidas ( \\ ) para indicar una.

Secuencias de escape

La siguiente tabla incluye secuencias de escape definidas en C estándar, así como algunas secuencias no estándar. El estándar C requiere que se diagnostique una secuencia de escape que no coincida con una secuencia definida, es decir, el compilador debe imprimir un mensaje de error. De todas formas, algunos compiladores definen secuencias de escape adicionales.

La tabla muestra el valor ASCII al que se asigna una secuencia; sin embargo, puede asignarse a valores diferentes según la codificación.

Escapar

^ La secuencia no estándar \e representa el carácter de escape en GCC , [2] clang y tcc . No se agregó al estándar C porque no tiene un equivalente significativo en algunos conjuntos de caracteres (como EBCDIC ). [1]

Nueva línea

La secuencia \n se asigna a un byte, a pesar del hecho de que la plataforma puede usar más de un byte para indicar una nueva línea, como la secuencia CRLF de DOS / Windows , 0x0D 0x0A . La traducción de 0x0A a 0x0D 0x0A en DOS y Windows ocurre cuando el byte se escribe en un archivo o en la consola, y la traducción inversa se realiza cuando se leen archivos de texto.

Maleficio

Una secuencia de escape hexadecimal debe tener al menos un dígito hexadecimal después de \x , sin límite superior; continúa por tantos dígitos hexadecimales como haya. Así, por ejemplo, \xABCDEFG denota el byte con el valor numérico ABCDEF 16 , seguido de la letra G , que no es un dígito hexadecimal. Sin embargo, si el valor entero resultante es demasiado grande para caber en un solo byte, el valor numérico real asignado está definido por la implementación. La mayoría de las plataformas tienen tipos char de 8 bits , lo que limita una secuencia de escape hexadecimal útil a dos dígitos hexadecimales. Sin embargo, las secuencias de escape hexadecimales más largas que dos dígitos hexadecimales pueden ser útiles dentro de un carácter ancho o una cadena literal ancha (con el prefijo L):

// un solo carácter con valor 0x12 (18 decimales) char s1 [] = " \x12 " ; // un solo carácter con valor definido por la implementación, a menos que char sea lo suficientemente largo char s1 [] = " \x1234 " ; // un solo wchar_t con valor 0x1234, siempre que wchar_t sea lo suficientemente largo (16 bits son suficientes) wchar_t s2 [] = L " \x1234 " ;         

Octal

^ Una secuencia de escape octal consiste en una barra invertida seguida de uno a tres dígitos octales. La secuencia de escape octal termina cuando contiene tres dígitos octales o el siguiente carácter no es un dígito octal. Por ejemplo, \11 es una secuencia de escape octal que denota un byte con valor decimal 9 (11 en octal). Sin embargo, \1111 es la secuencia de escape octal \111 seguida del dígito 1. Para denotar el byte con valor numérico 1, seguido del dígito 1 , se podría usar "\1""1" , ya que C concatena literales de cadena adyacentes.

Algunas secuencias de escape octales de tres dígitos son demasiado grandes para caber en un solo byte. Esto da como resultado un valor definido por la implementación para el byte resultante.

La secuencia de escape \0 es una secuencia de escape octal comúnmente utilizada, que denota el carácter nulo, con valor cero en ASCII y la mayoría de los sistemas de codificación.

Nombres de personajes universales

^ ^ Desde elestándar C99 , C admite secuencias de escape que denotan puntos de código Unicode , llamados nombres de caracteres universales . Tienen la forma \u hhhh o \U hhhhhhhh , donde h representa un dígito hexadecimal. A diferencia de otras secuencias de escape, un nombre de carácter universal puede expandirse a más de una unidad de código.

La secuencia \u hhhh denota el punto de código hhhhh , interpretado como un número hexadecimal. La secuencia \U hhhhhhhh denota el punto de código hhhhhhhh , interpretado como un número hexadecimal. Los puntos de código ubicados en U+10000 o más deben denotarse con la sintaxis \U , mientras que los puntos de código inferiores pueden usar \u o \U . El punto de código se convierte en una secuencia de unidades de código en la codificación del tipo de destino en el sistema de destino. Por ejemplo, donde la codificación es UTF-8 y UTF-16 para wchar_t :

// Un solo byte con el valor 0xC0; no es válido UTF-8 char s1 [] = " \xC0 " ; // Dos bytes con los valores 0xC3, 0x80; la codificación UTF-8 de U+00C0 char s2 [] = " \u00C0 " ; // Un solo wchar_t con el valor 0x00C0 wchar_t s3 [] = L " \xC0 " ; // Un solo wchar_t con el valor 0x00C0 wchar_t s4 [] = L " \u00C0 " ;            

Un valor mayor que \U0000FFFF puede representarse mediante un solo wchar_t si se utiliza la codificación UTF-32 , o dos si se utiliza UTF-16.

Es importante destacar que el nombre de carácter universal \u00C0 siempre denota el carácter "À", independientemente del tipo de cadena literal en la que se utilice o de la codificación en uso. Las secuencias de escape octales y hexadecimales siempre denotan ciertas secuencias de valores numéricos, independientemente de la codificación. Por lo tanto, los nombres de caracteres universales son complementarios a las secuencias de escape octales y hexadecimales; mientras que las secuencias de escape octales y hexadecimales representan unidades de código, los nombres de caracteres universales representan puntos de código, que pueden considerarse como caracteres "lógicos".

Alternativas

Algunos lenguajes proporcionan mecanismos diferentes para codificar el comportamiento que proporciona la secuencia de escape. Por ejemplo, el siguiente código Pascal escribe las dos palabras en líneas secuenciales:

writeln ( 'Foo' ) ; escribir ( 'Bar' ) ;

writeln genera una nueva línea después del texto del parámetro, mientras que write no lo hace.

Véase también

Referencias

  1. ^ abc "Fundamento de la norma internacional - Lenguajes de programación - C" (PDF) . 5.10. Abril de 2003. Archivado (PDF) desde el original el 2016-06-06 . Consultado el 2010-10-17 .
  2. ^ "6.35 El carácter <ESC> en constantes". Manual de GCC 4.8.2 . Archivado desde el original el 2019-05-12 . Consultado el 2014-03-08 .

Lectura adicional