Chaine de caracteres en c

Résolu
bckflow Messages postés 444 Date d'inscription   Statut Membre Dernière intervention   -  
bckflow Messages postés 444 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   663
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   148 > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
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   Statut Membre Dernière intervention   663 > loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Contributeur Dernière intervention   1 846 > loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   663 > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
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   Statut Membre Dernière intervention   7
 
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   Statut Membre Dernière intervention   7
 
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   Statut Membre Dernière intervention   7
 
merci a tous pour vos infos elles me seront utiles sans nul doutes ;)
0