s'avère que ceci est juste un autre cas de "C ++ n'est pas C blues" p>
ce que je veux p> La seule chose qui fonctionne p> existe-y des options de compilateur ou quelque chose que je peux faire pour faire des chaînes non nuls terminées dans le compilateur de la GCC. afin que je puisse créer un tableau (n) constant p> h2>
6 Réponses :
pas. Les chaînes désignées sont intrinsèques dans la langue. Vous pouvez avoir un tableau de caractères cependant et définir chaque personnage un par un:
char hex [] = {'0', '1', '2', ... 'F'};
Bonne réponse. Juste une note qu'il apparaît que l'OP est intéressé à déclarer une gamme de 16 octets exactement afin qu'il pourrait être utile d'inclure le spécificateur de taille de tableau dans votre exemple ... const char hex [16] = {'0' , '1', '2', ... 'f'}; code>
Ils peuvent être intrinsèques mais le compilateur, au moyen de la norme, ne peut pas terminer une chaîne si elle ne correspond pas. Il n'est pas nécessaire d'analyser le caractère du caractère par caractère comme vous l'avez écrit parce que c'est déjà i> non-NUL a terminé la façon dont le pouvoir l'a.
@Siegex: À l'époque, j'ai posté ma réponse, la question n'a pas eu de balise C ++.
de même. La norme que je faisait référence est la norme «C99», mais elle devrait également s'appliquer à l'ANSI C aussi.
Les chaînes sont NULL terminées dans C. Si vous souhaitez peupler une matrice de caractères non nuls, vous pouvez utiliser un initialiseur de tableau. P>
Pas besoin d'une option de compilateur, c'est déjà em> non-nul terminé. La norme indique qu'une nul ne doit être ajoutée que si elle peut être adaptée, sinon ce serait un débordement. Il peut être simplement que l'octet suivant en mémoire passé votre tableau est \ 0 code> p>
Un tableau de caractère
le type peut être initialisé par un personnage
string littéral, éventuellement
enfermé dans des accolades. Caractères successifs de la chaîne de caractères
littéral ( y compris le
Termination du caractère null s'il y a de la place em> strong> ou si le tableau est de
taille inconnue) initialiser le
éléments du tableau. p>
blockQuote>
+1, votre réponse est meilleure que la mienne car elle cite la norme. :-)
Il convient de noter que ceci est différent en C ++ que dans C. C ++ exige qu'un initialisateur de tableau de caractères utilisant un littéral à chaîne doit ajouter le "\ 0" - les bonnes nouvelles sont que cela générera un temps de compilation Erreur si vous essayez de compiler le code qui dépend de ce comportement comme C ++.
@Glassghost - Si vous avez besoin de quelque chose qui fonctionne à la fois C et C ++, vous devez utiliser la solution de Wallyk.
@Glassghost - Si vous demandez si vous demandez de marquer le tableau en tant que externe "C" code> dans une compilation C ++ pourrait aider, je crains que ce ne soit pas.
J'ai une question. J'ai écrit un programme dans lequel j'initialise la matrice de caractère à une chaîne (Char par char et donner la taille entre crochets), puis je l'imprime. Mais cela n'entraîne pas une erreur car la matrice n'est pas terminée null. Pourquoi cela arrive-t-il?
Vous avez répondu à votre propre question. Si vous donnez explicitement la matrice une longueur, comme dans: puis, il ne sera pas terminé de manière nuls car il n'y a pas de stockage réservé à la résiliation null. ( ou si vous utilisez la chaîne littérale comme objet plutôt que comme initialisateur, qu'il aura null Terminaison. P> Au fait, pourquoi vous souciez-vous de si la résiliation null est là ou non, si vous ne prévoyez pas l'utiliser. Essayez-vous de raser les octets de votre binaire? : -) p> p> hex [16] code> est en dehors des limites de l'objet et la lecture ou l'écriture est donc un comportement indéfini. S'il arrive à lire comme 0, c'est ub pour ya ...) p> < p> Ce n'est que si vous laissez la longueur implicite, comme dans: p>
@R.: Le fait que la résiliation nul pourrait être une question est une fuite d'abstraction dans le C, et aussi inévitable. Dans d'autres langues, on pourrait simplement définir un type permettant uniquement des valeurs 0..15 et d'utiliser ce type comme indice de réseau. Cela empêcherait les débordements de la matrice définie.
Et cela rendrait le type de vie de tout le monde-enfer. Plus il y a de type une langue (ou même une bibliothèque), plus il est difficile d'utiliser correctement.
Je crois que la question est un peu floue: en C, l'initialisation qoted: est légal. En C ++, ce n'est pas le cas. Donc, c'est l'un des morceaux de code, qui échoue (heureusement à la compilée), lorsque vous passez de C à C ++. P> Il serait agréable d'avoir un moyen de forcer les littéraux de chaîne sans terminaison \ 0 octet. Quelque chose comme: p> où le \! 0 code> à l'extrémité indique au compilateur de ne pas zéro terminer la chaîne!
\! code> ou même
\! 0 code> n'importe où ailleurs dans la chaîne se comporterait non modifié, donc simplement publier un
littéral! code> ou
! 0 code>. p> p>
Les citations doubles rendent le compilateur à traiter votre entrée en tant que chaîne zéro terminée. Si vous voulez 16 caractères aléatoires (qui peuvent inclure ou non un 0), n'utilisez tout simplement pas de citations doubles.
Il y a en fait une solution en partie pour ce numéro dans C ++ 17: Constexpr Code> Les fonctions peuvent renvoyer des objets de type
std :: Array code>. Ainsi, au lieu d'initialiser un tableau Const C, nous initialisons un consexpr c ++
std :: tableau code> à la place. Cette fonction de modèle bande le terminateur:
constexpr std::array<char, 16> hex = strip_terminator("0123456789ABCDEF");
Un autre exemple de la raison pour laquelle vous ne devriez pas généraliser généralement une question avec "C" et "C ++". Ici, la réponse dépend définitivement de la langue que vous utilisez. (Voir aussi C ++ 03 Standard C.1.6 [sur 8.5.2].)
@Schepler pourquoi oh pourquoi c ++ est-il devenu quelque chose d'autre que "C avec des cours"
Pourquoi ne pas utiliser de char hexal [] = "0123456789ABCDEF"?