web-dev-qa-db-fra.com

Combien d'octets une chaîne prend-elle? Un omble?

Je suis en train de passer en revue ma première session de cours C++ au premier semestre et je pense avoir oublié quelque chose. Combien d'octets une chaîne prend-elle? Un omble?

Les exemples qui nous ont été donnés sont, certains étant des littéraux de caractères et d'autres des chaînes:

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

Je suis particulièrement déconcerté par l'utilisation de nouvelles lignes dans ces applications.

8
Moshe
#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
}

Les guillemets simples indiquent les caractères, les guillemets doubles indiquent les chaînes de style C avec un terminateur NUL invisible.

\n (saut de ligne) correspond à un seul caractère, de même que \\ (barre oblique inversée). \\n est juste une barre oblique inverse suivie de n.

27
fredoverflow
  • Une char, par définition, occupe un octet.
  • Les littéraux utilisant ' sont des littéraux de caractères; les littéraux utilisant " sont des littéraux de chaîne.
  • Un littéral de chaîne est implicitement terminé par un caractère null, il utilisera donc un octet de plus que le nombre de caractères observable dans le littéral.
  • \ est le caractère d'échappement et \n est un caractère de nouvelle ligne.

Rassemblez-les et vous devriez pouvoir le comprendre.

6
ildjarn

Ce qui suit prendra x caractères consécutifs en mémoire:

'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

edit: mise en forme fixe

edit2: J'ai écrit quelque chose de très stupide, merci Mooing Duck pour l'avoir signalé.

4
Wojciech Cierpucha
  • 'n': n'est pas une chaîne, est un caractère littéral, un octet, le code ascii du caractère n.
  • "n": chaîne, deux octets, un pour n et un pour le caractère nul à la fin de chaque chaîne.
  • "\n": deux octets,\n signifiant "nouvelle ligne", qui prend un octet, plus un octet pour le caractère nul.
  • '\n': identique au premier caractère littéral, pas à une chaîne, mais à un octet.
  • "\\n": trois octets .. un pour \, un pour nouvelle ligne et le caractère nul
  • "": un octet, juste le caractère nul.
2
gztomas

Le nombre d'octets qu'une chaîne prend est égal au nombre de caractères de la chaîne plus 1 (le terminateur), multiplié par le nombre d'octets par caractère. Le nombre d'octets par caractère peut varier. Il s'agit d'un octet pour un type char régulier.

Tous vos exemples ont un caractère, à l'exception de l'avant-dernier, qui est deux, et le dernier, qui est zéro. (Certains sont de type char et ne définissent qu'un seul caractère.)

1
Jonathan Wood

'n' -> Une char. Une char est toujours 1 octet. Ce n'est pas une chaîne.
"n" -> Un littéral de chaîne, contenant une n et une terminaison NULL char. Donc 2 octets.
'\n' -> Une char, Une char est toujours 1 octet. Ce n'est pas une chaîne.
"\n" -> Un littéral de chaîne contenant un \n et un NULL char. Donc 2 octets.
"\\n" -> Un littéral de chaîne contenant un \, un '\ n' et un NULL char. Donc 3 octets.
"" -> Un littéral de chaîne, contenant une terminaison NULL char. Donc, 1 octet.

1
Mooing Duck
'n'   - 0x6e
"n"   - 0x6e00
'\n'  - 0x0a
"\n"  - 0x0a00
"\\n" - 0x5c6e00
""    - 0x00
0
triclosan

Vous semblez faire référence à des constantes de chaîne. Et en les distinguant des constantes de caractère.

Un char est un octet sur toutes les architectures. Une constante de caractère utilise le délimiteur guillemets '.

Une chaîne est une séquence contiguë de caractères avec un caractère NUL final pour identifier la fin de la chaîne. Une chaîne de caractères utilise des guillemets doubles "".

En outre, vous introduisez la syntaxe d'expression constante de chaîne C qui utilise des barres obliques pour indiquer les caractères spéciaux. \n est un caractère dans une constante de chaîne.

Donc, pour les exemples 'n', "n", '\n', "\n":
'n' est un caractère
"n" est une chaîne avec un caractère, mais il faut deux caractères de stockage (un pour la lettre n et un pour le NUL
'\n' est un caractère, la nouvelle ligne (ctrl-J sur les systèmes ASCII)
"\n" est un caractère plus un NUL.

Je laisse les autres se débrouiller avec.

0
wallyk