¿Puede alguien explicar el uso del carácter constante \ 000 y \ xhh, es decir, números octales y números hexadecimales en una constante de caracteres?constante de caracteres: 000 xhh
Respuesta
En C, las cadenas se terminan con un carácter con el valor cero (0). Esto podría escribirse así:
char zero = 0;
pero esto no funciona dentro de las cadenas. Hay una sintaxis especial utilizada en los literales de cadena, donde la barra invertida funciona como una introducción a la secuencia de escape, y es seguida por varias cosas.
Una secuencia de este tipo es "barra diagonal inversa cero", que simplemente significa un carácter con el valor cero. Por lo tanto, se puede escribir cosas como esta:
char hard[] = "this\0has embedded\0zero\0characters";
Otra secuencia utiliza una barra invertida seguida de la letra 'x'
y uno o dos dígitos hexadecimales, para representar el carácter con el código indicado. Usando esta sintaxis, podría escribir el byte cero como '\x0'
, por ejemplo.
EDIT: Al volver a leer la pregunta, también hay soporte para tales constantes en la base ocho, es decir, octal. Usan una barra invertida seguida por el dígito cero, al igual que las constantes enteras literales octal. '\00'
es por lo tanto un sinónimo de '\0'
.
Esto a veces es útil cuando necesita construir una cadena que contenga caracteres que no sean de impresión o caracteres de control especiales.
También hay un conjunto de caracteres especiales "con nombre" de un carácter, como '\n'
para nueva línea, '\t'
para TAB, y así sucesivamente.
Octal es base 8 (utilizando los dígitos 0-7) por lo que cada dígito es 3 bits:
\ 0354 = 11 101 100
Hexadecimal es base 16 (usando dígitos 0-9, AF) y cada dígito es de 4 bits:
\ x23 = 0010 0011
cadenas Dentro C (arrays char/punteros), que se utilizan generalmente para codificar bytes que no se pueden representar fácilmente.
Por lo tanto, si quieres una cadena que utiliza códigos ASCII como STX y ETX, que puede hacer:
char *msg = "\x02Here's my message\x03";
Se usarían para escribir caracteres que no sean imprimibles en el editor. Para los caracteres estándar, serían los distintos caracteres de control, para wchar podrían ser caracteres no representados en la fuente del editor.
Por ejemplo, esta compila en Visual Studio 2005:
const wchar_t bom = L'\xfffe'; /* Unicode byte-order marker */
const wchar_t hamza = L'\x0621'; /* Arabic Letter Hamza */
const char start_of_text = '\002'; /* Start-of-text */
const char end_of_text = '\003'; /* End-of-text */
Editar: El uso de caracteres literales octales tiene una advertencia interesante. Los números octales no pueden tener más de tres dígitos, lo que restringe artificialmente los caracteres que podemos ingresar.
Por ejemplo:
/* Letter schwa; capital unicode code point 0x018f (octal 0617)
* small unicode code point 0x0259 (octal 1131)
*/
const wchar_t Schwa2 = L'\x18f'; /* capital letter Schwa, correct */
const wchar_t Schwa1 = L'\617'; /* capital letter Schwa, correct */
const wchar_t schwa1 = L'\x259'; /* small letter schwa, correct */
const wchar_t schwa2 = L'\1131'; /* letter K (octal 113), incorrect */
- 1. clasificación 50 000 000 números
- 2. '\' - ¿Constante de caracteres no válida?
- 3. Fortran: el manejo de valores enteros de tamaño: ~ 700 000 000 000
- 4. apache 000-host virtual predeterminado
- 5. cygwin establece permiso de archivo para 000
- 6. ¿Cómo determinar el resultado de asignar una constante de caracteres de caracteres múltiples a una variable de caracteres?
- 7. Cómo analizar un número como "-2.000000e + 000"
- 8. ¿Qué es el código de estado HTTP 000?
- 9. Para permitir solo el host local en Apache 000-predeterminado
- 10. devolviendo un puntero a una matriz de caracteres literal (o constante) (cadena)?
- 11. Cómo distinguir cadena constante de char * en C macro
- 12. Funciones de miembro constante
- 13. Uso de constante indefinida
- 14. Vector de tamaño constante
- 15. ¿Por qué ElapsedTicks X 10 000 no es igual a ElapsedMilliseconds para .Net's Stopwatch?
- 16. constante de infinito de glsl
- 17. Inicialización matriz de caracteres con la cadena más pequeña literal
- 18. Obteniendo constante constante de recuperación de tiempo constante con listas inmutables en un contexto de programación funcional
- 19. puntero constante frente a un puntero en un valor constante
- 20. objetos de negocio 'estático/Constante'
- 21. Expresión de caso no constante
- 22. Constante de cadena sin terminar
- 23. Greasemonkey Version Script constante
- 24. vector con tamaño constante
- 25. definición constante en Clojure
- 26. C constante hexadecimal tipo
- 27. Constante DateTime en C#
- 28. Tiempo amortizado constante
- 29. Constante global Codeigniter
- 30. Constante ensambladora Delphi 'eof'
¿Qué pasa si usted quiere escribir "Este 0has \ \ 00 caracteres"? ¿Sería \ 0 interpretado como un byte '\ 0' o como '\ 0', '0'? ¿Cuál es el límite de la longitud de una secuencia de escape octal? – strager
@strager, no lo conozco pero podría usar <"this \ 0has \ 0" "0 chars"> ya que C solo los ejecutará juntos. – paxdiablo
pero c solo leerá esto de <"this \ 0has \ 00 chars">, ya que obtendrá el valor nulo \ 0 que es la condición de prueba para el final de cualquier cadena. ¿a qué te refieres con "podrías escribir cero byte como '\ x0'"? gracias por la respuesta! – mawia