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
salut a tous!

Voila, avant de vous exposer mon problème je tiens a dire que je ne cherche pas des réponses toutes faites mais des suggestions ou des pistes pour résoudre ce problème:

Je dois transformer une chaine de caractère char* en char**, merci pour toutes vos idées et votre aide :)

A voir également:

4 réponses

Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
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...)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
16 nov. 2009 à 21:50
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 !
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
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
16 nov. 2009 à 23:21
Je suis d'accord avec toi, 'phrase' est un vrai tableau; 'phrase' est une variable de type 'char[50]' dont la taille donnera bien 50.
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.
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660 > loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017
16 nov. 2009 à 23:44
cela a une importance quand même pour le compilateur en C++ en tout cas, et en C aussi si mes souvenirs sont bons, lorsque tu passes un const char* a une fonction qui accepte un char* il me semble que ça grogne du côté du compilo.

et voici un exemple pour résumer ce que le contributeur avant précisait :
#include<stdio.h>
int main (){
    char phrase[50]="Salut nounou!";
    const char* phrase2 = phrase;
    char* phrase3 = phrase;
    printf("%s, taille de phrase  : %d\n", phrase, sizeof(phrase));
    printf("%s, taille de phrase2 : %d\n", phrase2, sizeof(phrase2));
    printf("%s, taille de phrase3 : %d\n", phrase3, sizeof(phrase3));
    getchar();
} 
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017
16 nov. 2009 à 23:54
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.
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.
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
16 nov. 2009 à 23:59
merci beaucoup pour ces précisions fiddy!

(par contre l'auteur du sujet doit trouver qu'on s'écarte un peu :D)
0
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
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)
0
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
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.)
0
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
merci a tous pour vos infos elles me seront utiles sans nul doutes ;)
0