Chaine de caracteres en c
Résolu/Fermé
bckflow
Messages postés
444
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
30 octobre 2021
-
16 nov. 2009 à 20:34
bckflow Messages postés 444 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 30 octobre 2021 - 17 nov. 2009 à 20:08
bckflow Messages postés 444 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 30 octobre 2021 - 17 nov. 2009 à 20:08
A voir également:
- Chaine de caracteres en c
- Caractères ascii - Guide
- Chaine tnt gratuite sur mobile - Guide
- Caractères spéciaux clavier azerty - Guide
- Caractères spéciaux - Guide
- Plus de chaine tv - Guide
4 réponses
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
16 nov. 2009 à 20:43
16 nov. 2009 à 20:43
un char* est un pointeur sur un char, c'est-à-dire un pointeur sur un caractère.
Ce n'est pas tout fait une chaine mais presque.
En C une chaine c'est une suite de caractères en mémoire (comme un tableau !). La langage précise que cette suite doit se terminer par le caractère "vide", 0 en ASCII, c-à-d '\0' en C (ce qui est la même chose que la valeur numérique entière 0).
En fait, lorsque tu crées une chaine du genre : char phrase[50] = "Salut!", le tableau phrase est rempli de char comme suit :
'S' 'a' 'l' 'u' 't' '!' '\0'
note qu'il y a encore plein de cases dans le tableau qui contiennent n'importe quoi, on s'en fiche puisque le C ne lira pas la chaine après le '\0' (par exemple si tu fais un truc du genre printf(phrase) )
En fait, en C, le nom du tableau (phrase) est en fait justement un pointeur (constant si je ne me trompe pas) vers le premier élément du tableau ! phrase est pour le C de type const char * (et chaque phrase[0], phrase[1] signifie que tu prends le pointeur, tu le décales si besoin de ce qui est entre crochet, et tu le déréférence avec un *, et tu obtiens ton char.
phrase[5] est un peu comme faire (phrase+5*sizeof(char))* (toujours si je ne me trompe pas...)
Ce n'est pas tout fait une chaine mais presque.
En C une chaine c'est une suite de caractères en mémoire (comme un tableau !). La langage précise que cette suite doit se terminer par le caractère "vide", 0 en ASCII, c-à-d '\0' en C (ce qui est la même chose que la valeur numérique entière 0).
En fait, lorsque tu crées une chaine du genre : char phrase[50] = "Salut!", le tableau phrase est rempli de char comme suit :
'S' 'a' 'l' 'u' 't' '!' '\0'
note qu'il y a encore plein de cases dans le tableau qui contiennent n'importe quoi, on s'en fiche puisque le C ne lira pas la chaine après le '\0' (par exemple si tu fais un truc du genre printf(phrase) )
En fait, en C, le nom du tableau (phrase) est en fait justement un pointeur (constant si je ne me trompe pas) vers le premier élément du tableau ! phrase est pour le C de type const char * (et chaque phrase[0], phrase[1] signifie que tu prends le pointeur, tu le décales si besoin de ce qui est entre crochet, et tu le déréférence avec un *, et tu obtiens ton char.
phrase[5] est un peu comme faire (phrase+5*sizeof(char))* (toujours si je ne me trompe pas...)
bckflow
Messages postés
444
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
30 octobre 2021
7
16 nov. 2009 à 21:08
16 nov. 2009 à 21:08
Merci, j ai du mal m exprimer, en fait j ai une chaine de caractere dans un tableau a une dimension et je souhaiterai decomposer la chaine pour l inclure dans un tableau a deux dimension (type char **str)
bckflow
Messages postés
444
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
30 octobre 2021
7
16 nov. 2009 à 21:14
16 nov. 2009 à 21:14
en clair j ai un fichier que j ouvre avec une fonction cat et je recupere ensuite son contenu pour le lire et le modifier (j ai des "." des " " et des "o" dans ma chaine et je doit trouver le plus grand carre dans les lignes entre les "o"
par exemple:
...o.......o.
....o......o.
.o........o..
Mon carre le plus grand fait 5 sur 5.)
par exemple:
...o.......o.
....o......o.
.o........o..
Mon carre le plus grand fait 5 sur 5.)
bckflow
Messages postés
444
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
30 octobre 2021
7
17 nov. 2009 à 20:08
17 nov. 2009 à 20:08
merci a tous pour vos infos elles me seront utiles sans nul doutes ;)
16 nov. 2009 à 21:50
Non pas exactement, phrase est un vrai tableau. La preuve est que sizeof tableau renverra 50. L'histoire du pointeur constant, c'est lorsque tu l'envoies en argument d'une fonction puisqu'en C, il n'est pas possible d'envoyer de tableau à proprement parlé en argument.
Cdlt
16 nov. 2009 à 23:21
Je suis d'accord qu'on ne peut envoyer le tableau en tant que tableau comme argument dans une fonction mais si le besoin s'en fait sentir on peut transmettre 'phrase' comme s'il s'agissait d'un pointeur; constant ou pas, en fait, cela n'a pas d'importance puisque la fonction ne pourra pas modifier le pointeur.
Par contre le fait de considérer 'phrase' comme pointeur constant est important car cela signifie qu'on ne pourra pas modifier l'adresse sur lequel il pointe, ce n'est pas une 'lvalue' modifiable; si cela était possible , en fait ce serait comme si, après avoir défini un 'int i', on pourrait faire pointer 'i' sur une autre case mémoire, ce qui n'a aucun sens.
Ai-je commis une erreur d'interprétation ?
Bonne soirée.
16 nov. 2009 à 23:44
et voici un exemple pour résumer ce que le contributeur avant précisait :
16 nov. 2009 à 23:54
Encore heureux ^^. Ce que j'ai dit c'était juste pour insister sur la différence entre un char* et un char[]. Le compilateur convertira automatiquement le tableau en pointeur sur le premier élément en argument d'une fonction (et même de manière plus générale dans tout expression sauf cas particulier (sizeof, ...).
Par contre le fait de considérer 'phrase' comme pointeur constant est important car cela
Je vois ce que tu veux dire, mais ce n'est pas exactement ça. En fait, le tableau est une Rvalue de type pointeur puisque l'adresse ne peut évidement pas être changée. C'est pour cette raison qu'il est d'usage de mettre char *const dans le prototype d'une fonction prenant un "tableau" en argument.
16 nov. 2009 à 23:59
(par contre l'auteur du sujet doit trouver qu'on s'écarte un peu :D)