Je suis censé répondre à une question de devoirs pour l'un de mes cours. Plus précisément, je suis censé dire si certains tableaux en C sont considérés comme des chaînes ou non. Sur la base de cet article ( https://www.geeksforgeeks.org/strings-in-c-2/ ), je sais que les chaînes sont un tableau de caractères avec le terminateur nul à la fin.
Mon principal blocage est une partie de la question qui pose un tableau qui ressemble à ceci:
char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
Il s'agit évidemment d'un tableau de caractères avec un caractère de fin nul à la fin. Cependant, est-elle toujours considérée comme une chaîne car elle a également un caractère de fin nul au milieu? Comment cela affectera-t-il la chaîne?
EDIT: Sur la base des commentaires, j'ai fourni le libellé réel de la question:
"Lequel des tableaux suivants peut être considéré comme des" chaînes "dans le but de les utiliser comme arguments pour strcpy (), strncpy (), strcmp (), strncmp () et des fonctions de chaîne similaires (indiquer toutes les applications)?"
EDIT: J'ai envoyé un courriel à mon professeur à ce sujet car la question semblait libellée de manière ambiguë (comme plusieurs personnes l'ont souligné). Si quelqu'un est curieux, il m'a dit "Oui, c'est une chaîne. La clé est qu'il y a un caractère nul. Mais bien sûr, cela affectera toutes les opérations de chaîne; la chaîne se termine au caractère nul."
la source
"CS"
avec quelques octets de déchets ajoutés (auquel cas le caractère NUL final n'est pas pertinent). Mais ce n'est pas une chaîne "dans son ensemble". - Néanmoins, le nourrir,strcpy
etc. ne fera pas exploser votre PC car ces fonctions ne "verront" que la"CS"
pièce.strcmp()
. Le fait qu'il puisse être utilisé comme argument pour muter des fonctions de chaîne dépend de facteurs supplémentaires qui ne sont pas fournis.c1
est modifiable, donc je ne vois pas pourquoi il ne serait pas un argument de destination valide pourstrcpy
ou similaire, sauf s'il n'était pas assez grand pour accueillir la chaîne source. Cela ne ferait pas que ce ne soit pas une chaîne, mais pas une chaîne adaptée à un objectif donné.c1
satisferait les exigences de base pour les arguments de chaîne pour toutes les fonctions de chaîne (étroites) de la bibliothèque standard, y compris toutes celles spécifiquement nommées, mais le comportement pourrait ne pas être ce que l'appelant attend ou veut (même en ignorant les comportements indéfinis qui pourraient être obtenus).char
. N'importe quel type de caractère fera l'affaire.Réponses:
c1
est la plupart du temps [1] équivalente à&c1[0]
, qui tient une chaîne"CS"
.Il y a une deuxième chaîne qui se cache là - dedans,
"324"
, à partir de&c1[3]
- mais aussi longtemps que vous accédezc1
commec1
, la chaîne"CS"
est toutes les fonctionsstrcpy()
et al. verrait.[1]:
c1
est un tableau,&c1[0]
est un pointeur.la source
c1
comme chaîne cible dans unestrcpy()
commande? La question est ambiguë - au mieux.c1
comme argument pourstrcpy()
. C'est une corde parfaitement ordinaire dans tous les sens. Les chaînes ordinaires contiennent souvent des déchets résiduels après leurs terminateurs. Le fait que ces ordures soient codées en dur dans le programme donne l'impression que l'auteur a l'intention d'utiliserc1
de manière non chaîne, mais cela ne faisait pas partie de la question.c1
équivaut à&c1[0]
" induit en erreur.c1
est un tableau.&c1[0]
est un pointeur.Si vous voulez connaître les spécificités de la définition d'une chaîne en C, allez à la source.
De la norme C90 :
(Il n'y a eu aucun changement pertinent dans les normes ultérieures.)
Ainsi,
c1
contient deux chaînes consécutives, "CS" et "324", mais n'est pas lui-même une chaîne.Si nous passons un tableau à une fonction, il se désintègre en un pointeur sur son premier élément,
+c1
pointe donc sur une chaîne (le premier), ce qui est assez bon pour toute fonction qui attend un pointeur sur une chaîne. Il ne pointe pas vers une chaîne "CS \ 0324", mais c'est probablement suffisant pour la question de vos instructeurs, ce qui est ambigu.la source
+c1
pointe sur une chaîne, carc1
commence par une chaîne. Cela ne fait en aucun cas, forme ou formec1
une chaîne.Ajout à la réponse de @ DevSolar, quelque chose que j'ai découvert après avoir joué avec la chaîne donnée, si elle devait être:
Si vous produisez cette chaîne, vous obtiendrez
CS03240
et la taille de cette chaîne est de 7. Pour autant que je sache,\\0
est utilisé pour désigner le caractère nul ( ie\0
). Si tu fais:Vous ne voyez rien dans le journal de sortie, mais si vous le faites:
Vous voyez un
\0
, quelque chose qui est attendu car pour générer des caractères spéciaux tels que des barres obliques inverses ou des guillemets, vous devez utiliser un\
avec eux.Quelque chose qui me laisse perplexe est la sortie
CS03240
et sa taille 7. Il est communément admis que la taille d'une chaîne est le nombre de caractères qu'elle contient plus un (pour le caractère nul). En outre, la taille est 7 même pour la chaîne,char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
.Alors peut-être une suite à cette question, que se passe-t-il ici?
la source
'\\0'
n'est pas un caractère nul . C'est une constante à plusieurs caractères. Il a une valeur définie de mise en œuvre certainement hors de la plage dechar
.c1[]
n'est pas une chaîne car il lui manque un caractère nul . "vous sortez cette chaîne" entraîne probablement un comportement indéfini .char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
est de taille 7 car il est initialisé avec 7 valeurs. Sa taille n'a rien à voir avec les cordes .char c1[] = { 1, 2, 3, 4, 5, 6, 7 };
ferait encore la taille 7.c1
contient-il une piqûre? C'est une question distincte. Voir aussi