2012-02-21 40 views
6

Estoy haciendo una revisión de mi clase de C++ de primer semestre, y creo que me falta algo. ¿Cuántos bytes ocupa una cadena? ¿Un char?¿Cuántos bytes toma una cadena? ¿Un char?

Los ejemplos que nos dieron son, algunos caracteres literales Ser y algunas cadenas son:

'n', "n", '\n', "\n", "\\n", ""

Estoy particularmente confundido por el uso de las nuevas líneas de allí.

+0

Por "cadena", ¿quiere decir 'std :: string' o null terminated' char * '? –

Respuesta

24
#include <iostream> 

int main() 
{ 
     std::cout << sizeof 'n' << std::endl; // 1 
     std::cout << sizeof "n" << std::endl; // 2 
     std::cout << sizeof '\n' << std::endl; // 1 
     std::cout << sizeof 'n' << std::endl; // 1 
     std::cout << sizeof "\n" << std::endl; // 2 
     std::cout << sizeof "\\n" << std::endl; // 3 
     std::cout << sizeof "n" << std::endl; // 2 
} 

Las comillas simples indican caracteres, las comillas dobles indican cadenas estilo C con un terminador NULL invisible.

\n (salto de línea) es solo un único carácter, al igual que \\ (barra invertida). \\n es solo una barra invertida seguida de n.

+2

Quiero +1 si me explicaste que es tarea. – Pubby

+2

Te haría +1 si cambiaras 'std :: endl' a' '\ n''. –

+12

@Rob: Como ''\ n'' ya es parte de la tarea, no quería confundir innecesariamente a Moshe. – fredoverflow

1

El número de bytes que toma una cadena es igual al número de caracteres en la cadena más 1 (el terminador), multiplicado por el número de bytes por carácter. La cantidad de bytes por personaje puede variar. Es de 1 byte para un tipo regular de char.

Todos sus ejemplos tienen un carácter de largo excepto el penúltimo, que es dos, y el último, que es cero. (Algunos son de tipo char y sólo definen un único carácter.)

+0

El número de bytes por 'char' es 1. ** Siempre **. Por favor edita la respuesta. –

+0

'char' es, por definición, 1 byte, sin embargo, un byte puede no ser de 8 bits. – Pubby

+0

@Joe: El estándar C lo aclara: 1 byte debe ser _al menos_ 8 bits, pero puede ser más. – ildjarn

5
  • Un char, por definición, ocupa un byte.
  • Los literales que usan ' son literales de caracteres; los literales que usan " son literales de cadena.
  • Una cadena literal está implícitamente terminada en nulo, por lo que ocupará un byte más que el número observable de caracteres en el literal.
  • \ es el carácter de escape y \n es un carácter de nueva línea.

Póngalos juntos y debería poder resolverlo.

0
'n' - 0x6e 
"n" - 0x6e00 
'\n' - 0x0a 
"\n" - 0x0a00 
"\\n" - 0x5c6e00 
"" - 0x00 
3

A continuación se llevará x caracteres consecutivos en la memoria:

'n' - 1 char (type char) 
"n" - 2 chars (above plus zero character) (type const char[2]) 
'\n' - 1 char 
"\n" - 2 chars 
"\\n" - 3 chars ('\', 'n', and zero) 
"" - 1 char 

edición: el formato fijo

Edit2: He escrito algo muy estúpido, gracias Mooing pato por señalarlo.

+1

En realidad, sizeof ("n") debería ser igual a 2. El tipo de " n "is _not_ a' const char * ', pero es' const char [2] ', que son dos bytes. –

+0

Mooing Duck - verdadero, mi malo –

0

Parece que se está refiriendo a las constantes de cadena. Y distinguirlos de las constantes de los personajes.

A char es de un byte en todas las arquitecturas. Una constante de caracteres utiliza el delimitador de comilla simple '.

Una cadena es una secuencia contigua de caracteres con un carácter NUL posterior para identificar el final de la cadena. Una cadena utiliza caracteres de comillas dobles '' ''.

Además, introduce la sintaxis de la expresión constante de cadena C que usa barras negras para indicar caracteres especiales.\n es un caracter en una constante de cadena.

Así que para los ejemplos 'n', "n", '\n', "\n":
'n' es un personaje
"n" es una cadena con un carácter, pero se necesita dos caracteres de almacenamiento (uno para la letra n y otro para el NUL
'\n' es un personaje , la nueva línea (Ctrl-J en sistemas basados ​​en ASCII)
"\n" es un carácter más un NUL.

dejo a los demás de descifrar sobre la base de esos.

+0

's/constants/literals /' –

1

'n' -> Uno char. Un char siempre es de 1 byte. Esto no es una cadena.
"n" -> Una cadena literal, que contiene un n y uno que termina NULL char. Entonces 2 bytes
'\n' -> Uno char, A char es siempre de 1 byte. Esto no es una cadena.
"\n" -> Una cadena literal, que contiene un \n y uno que termina NULL char. Entonces 2 bytes
"\\n" -> Un literal de cadena, que contiene un \, uno '\ n' y uno que termina NULL char. Entonces 3 bytes
"" -> Una cadena literal, que contiene una terminación NULL char. Entonces 1 byte.

2
  • 'n': no es una cadena, es un carácter literal, un byte, el código ascii para el carácter n.
  • "n": cadena, dos bytes, uno para ny uno para el carácter nulo que tiene cada cadena al final.
  • "\n": dos bytes como \ n significan "nueva línea" que toma un byte, más un byte para el carácter nulo.
  • '\n': igual que el primero, carácter literal, no una cadena, un byte.
  • "\\n": tres bytes .. uno de \, uno para la nueva línea y el carácter nulo
  • "": un byte, sólo el carácter nulo.
+0

Elaborar en "cadena" (cadena C? 'Std :: cadena'?String literal?) Para la claridad gana. –

+0

Lo siento, quise decir C cadenas. – gztomas

Cuestiones relacionadas