stringtranslate.com

Secuencias de escape en C

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

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

Se utilizan secuencias de escape iguales o similares 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 línea, el código debe generar una nueva línea entre las dos palabras.

El siguiente código logra el objetivo mediante el formato de texto y un valor de carácter ASCII codificado para 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 así 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 escapa a la forma literal y normal del compilador de interpretar los datos de caracteres. Después de una barra invertida, el compilador espera que los caracteres siguientes 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 el estándar C, así como algunas secuencias no estándar. El estándar C requiere una secuencia de escape que no coincida con una secuencia definida para ser diagnosticada; es decir, el compilador debe imprimir un mensaje de error. De todos modos, algunos compiladores definen secuencias de escape adicionales.

La tabla muestra el valor ASCII al que se asigna una secuencia; sin embargo, puede asignarse a diferentes valores 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 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 durante 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 de caracteres de 8 bits , lo que limita una secuencia de escape hexadecimal útil a dos dígitos hexadecimales. Sin embargo, las secuencias de escape hexadecimal de más de dos dígitos hexadecimales pueden ser útiles dentro de un carácter ancho o una cadena literal ancha (con el prefijo L):

// carácter único con valor 0x12 (18 decimal) char s1 [] = " \x12 " ; // carácter único con valor definido por la implementación, a menos que el carácter sea lo suficientemente largo char s1 [] = " \x1234 " ; // wchar_t único 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 consta de una barra invertida seguida de uno a tres dígitos octales. La secuencia de escape octal finaliza 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 indica 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 el está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, el nombre de un carácter universal puede expandirse a más de una unidad de código.

La secuencia \u hhhh denota el punto de código hhhh , 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 superior deben indicarse 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; carácter UTF-8 no válido s1 [] = " \xC0 " ; // Dos bytes con 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 usa la codificación UTF-32 , o dos si se usa UTF-16.

Es importante destacar que el nombre del 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 que se utilice. Las secuencias de escape octal y hexadecimal siempre denotan ciertas secuencias de valores numéricos, independientemente de la codificación. Por lo tanto, los nombres de caracteres universales son complementarios de 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 caracteres "lógicos".

Alternativas

Algunos lenguajes proporcionan diferentes mecanismos 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:

escrito ( 'Foo' ) ; escribir ( 'Barra' ) ;

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

Ver también

Referencias

  1. ^ abc "Justificación del estándar internacional - Lenguajes de programación - C" (PDF) . 5.10. Abril de 2003. Archivado (PDF) desde el original el 6 de junio de 2016 . Consultado el 17 de octubre de 2010 .
  2. ^ "6.35 El carácter <ESC> en constantes". Manual GCC 4.8.2 . Archivado desde el original el 12 de mayo de 2019 . Consultado el 8 de marzo de 2014 .

Otras lecturas