initialisation des tableaux de char, de manière analogue à l'initialisation des littéraux de chaîne
Suppose que j'ai la suite de l'initialisation d'un tableau de char:
char charArray[]={'h','e','l','l','o',' ','w','o','r','l','d'};
et j'ai aussi la suite de l'initialisation d'une chaîne de caractères littérale:
char stringLiteral[]="hello world";
La seule différence entre le contenu du premier tableau et la deuxième chaîne est que la deuxième chaîne a un caractère nul à la fin.
Quand il est question de l'initialisation d'un tableau de char, est-il une macro ou quelque chose qui nous permet de mettre notre initialisation de texte entre deux guillemets doubles, mais où le tableau ne prend pas en obtenir un supplément de caractère null de la fin?
Il n'a tout simplement pas de sens pour moi que lorsqu'un caractère de fin null n'est pas nécessaire, il faut utiliser la syntaxe de la première mention d'initialisation et d'écrire deux guillemets simples pour chaque caractère dans l'initialiseur de texte, ainsi que la virgule de marques de caractères.
Je dois ajouter que lorsque je veux avoir un tableau de char, il devrait être aussi évident que je ne veux pas l'utiliser avec des fonctions qui s'appuient sur les littéraux de chaîne avec le fait qu'aucun des fonctions dans lesquelles l'aide de littéraux de chaîne de résultats, est en ma considération.
Je suis reconnaissant pour vos réponses.
Le PROBLÈME que vous devez faire face est que "les chaînes entre guillemets" sont tenus par la langue à NULLE fin.
OriginalL'auteur Pooria | 2010-07-09
Vous devez vous connecter pour publier un commentaire.
Il est permis en C pour déclarer le tableau suivant, qui va initialiser sans la copie de la résiliation de
'\0'
Mais il est illégal en C++. Je ne suis pas au courant d'un truc qui permettrait de C++. La Norme C++ dit plus
Justification: Lorsque ces non-terminé les tableaux sont manipulés par le standard de la chaîne de routines, il existe un potentiel de catastrophe majeure.
Effet sur la fonction d'origine: Suppression de la sémantique bien définie fonctionnalité.
De la difficulté de la conversion de: Sémantique de la transformation. Les tableaux doivent être déclarées à un élément plus grand pour contenir la chaîne de terminaison ’\0’.
Comment largement utilisé: Rarement. Ce style d'initialisation de tableau est considéré comme mauvais style de codage.
char c[4] = "foo";
ne mettre que le caractère nul droit? Est-ce toujours le mauvais style de codage visés? Que diriez -char[128] = "";
? Seule l'initialisation d'un tampon? Est ce que tout droit? Ou estchar[128] = { '\0' };
mieux?Selon le livre de référence par Randal Albert,
char c[4] = "foo";
placez un caractère null pour vous et selon le livre, il est recommandé de l'écrire commechar[4] = "foo";
.char c[3] = "foo";
est illégal parce que nous avons besoin de réserver un espace pour le caractère de fin null à l'arrière.la peine de lire la totalité de ma réponse qui dit "Les tableaux doivent être déclarées à un élément plus grand pour contenir la chaîne de terminaison ’\0’."
OriginalL'auteur Johannes Schaub - litb
Il n'y a pas moyen de faire ce que vous voulez. La première façon de l'initialisation du tableau indique séparer les initialiseurs pour chaque personnage, ce qui permet explicitement de laisser tomber le '\0'. La deuxième est l'initialisation d'un tableau de caractères à partir d'une chaîne de caractères, ce qui en C/C++ est toujours terminé par un caractère nul.
EDIT: corrigé: caractère 'pointeur' --> 'array'
jamais remarqué que le "caractère distinct des initialiseurs de" concept, merci
OriginalL'auteur hkaiser
litb a l'techniquement bonne réponse.
Comme pour avis - je dis juste vivre avec les "déchets" de l'extra '\0'. Donc, beaucoup de bugs sont le résultat de code attend une valeur null où l'on ne l'est pas (ce conseil peut sembler aller directement à l'encontre de certains autres conseils que j'ai donné juste un jour ou deux, il ya de ne pas déranger à zéro l'ensemble d'un tampon. Je demande il n'y a pas de contradiction - j'ai toujours préconisé null de la fin de la chaîne de caractères dans la mémoire tampon).
Si vous ne pouvez vraiment pas vivre avec le '\0' terminator en raison de la sémantique dans la structure de données que vous avez affaire, telle qu'elle pourrait être une partie de certains des plus grands structure compacte, vous pouvez toujours initialisation de la matrice de vous-même (ce qui je pense ne devrait pas être moins efficace que ce que le compilateur peut-être fait pour vous):
c'est probablement vrai pour
const char[]
éléments, mais je pense que le plus souvent non-const tableaux ont leurs valeurs initiales copié à partir du programme de l'image de "texte" (qui n'est pas accessible en écriture sur la plupart des plates-formes) dans la RAM avant demain()
est invoquée. Tant que lememcpy()
est fait en une seule fois, l'efficacité sage, il est à peu près six, demi-douzaine de l'autre si c'est fait par le moteur d'exécution ou de votre code.OriginalL'auteur Michael Burr
La réponse de base est que la grande majorité des tableaux de char sont des chaînes de caractères en C, les chaînes sont null. C++ a hérité de cette convention. Même lorsque que null n'est pas nécessaire, la plupart du temps, il n'est pas un problème juste pour l'y laisser, de toute façon.
Les Macros ne sont pas assez puissant pour faire ce que vous voulez. Modèles serait, sauf qu'ils n'ont pas le temps de compilation, la manipulation des chaînes.
Habituellement, quand les gens veulent mélanger numérique octets et les littéraux de chaîne dans la même char-tableau de séquence, ils utilisent une chaîne littérale, mais utiliser hex personnage s'échappe comme
\xFF
.OriginalL'auteur Steve314
Je pourrais avoir trouvé un moyen de faire ce que je veux même si elle n'est pas directement ce que je voulais, mais il a probablement le même effet.
D'abord considérer deux classes suivantes:
Avant de procéder, vous pouvez aller de l' ici et de prendre un coup d'oeil à l'expression constante des constructeurs et des types d'initialisation.
Maintenant regardez le code suivant:
Enfin initialiseur texte est écrit entre deux citations.
apprécié
OriginalL'auteur Pooria