Bonsoir,
Existe t'il une solution pour convertir une chaine char en un tableau?
Version imprimable
Bonsoir,
Existe t'il une solution pour convertir une chaine char en un tableau?
Ça dépend de ce que tu veux faire.
Si tu veux déposer chaque caractère dans sa propre « case », alors ta chaîne est déjà un tableau. Tu peux dès maintenant indexer tes caractères avec chaine[0], chaine[1], chaine[2], etc.
Au fait ce n'est même un une chaine char que j'ai, mais une const char:
exemple:
const char *argv;
argv = "toto titi";
le but c'est d'avoir:
chaine[0] = toto et chaine[1]=titi
Salut
Le concept "chaine" n'existe pas en C. Il est donc simulé par l'utilisation d'un tableau de char où chaque case du tableau contient un caractère de la chaine.
Et pour que le programmeur sache où s'arrête la chaine, le tableau contient une case supplémentaire contenant le caractère '\0'.
Ensuite, suffit de créer des fonctions permettant de manipuler (copier, afficher, compter) les chaines ; ces fonctions se basant toutes sur le caractère '\0'. Et, comble du bonheur, ces fonctions ont déjà été écrites et sont à ta disposition.
A partir de là, puisqu'une chaine c'est déjà un tableau, ta question n'a plus trop de sens...
J'avais pas vu ton édit quand j'ai posté. Donc déjà ça fait une sacrée différence avec ta question initiale...
Tu peux le faire en utilisant strtok_r()
Bon j'ai tapé cet exemple vite fait sans le tester mais ça devrait être bon. Et on peut même le faire en une ligne mais ça devient alors assez imbitable...Code:
1
2
3
4
5
6
7
8
9
10
11 char *argv="toto titi"; char *word, *mem; char* chaine[2]; size_t i; for (word=strtok_r(argv, " ", &mem), i=0; word != NULL; word=strtok_r(NULL, " ", &mem), i++) { chaine[i]=word; }
Si j'ai bien compris, il te faut un tableau de chaines (char**).
Tu en déclares un et tu affecte un char* à chacune de ses cases.
Ok, je vais tester ca demain et je vous tiens au courant.
Merci bien
quand je compile le code j'ai des erreurs
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 void preferences_arrt (int argc, char **argv) { int i; int quote; entries_count = 0; const char *param; /*int argc;*/ char *word, *mem; char* chaine[2]; int i; param = preferences_get ("Parameters"); argc = wpreferencecount (); for (word=strtok_r(param, " ", &mem), i=0; word != NULL; word=strtok_r(NULL, " ", &mem), i++) { chaine[i]=word; }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 preferences.c(101) : error C2143: syntax error : missing ';' before 'const' preferences.c(103) : error C2143: syntax error : missing ';' before 'type' preferences.c(104) : error C2143: syntax error : missing ';' before 'type' preferences.c(105) : error C2143: syntax error : missing ';' before 'type' preferences.c(107) : error C2065: 'param' : undeclared identifier preferences.c(107) : warnin g C4047: '=' : 'int' differs in levels of indirection from 'const char *' preferences.c(111) : error C2065: 'word' : undeclared identifier preferences.c(111) : warnin g C4013: 'strtok_r' undefined; assuming extern returning int preferences.c(111) : error C2065: 'mem' : undeclared identifier preferences.c(111) : warnin g C4047: '!=' : 'int' differs in levels of indirection from 'void *' preferences.c(113) : error C2065: 'chaine' : undeclared identifier preferences.c(113) : error C2109: subscript requires array or pointer type Build process ended with: Compilation error(s) using win32-vc8
preferen
ces.obj : error LNK2019: unresolved external symbol _strtok_r referenced in func
tion preferences_arrt
entries_count n'a pas de type. Pour moi c'est probablement un int, mais le compilateur ne le sait pas, lui.
Edit : include <string.h> manque aussi.
entries_count est declaré en globale ce n'est pas sur sa qu'il ya l'erreur...
Après quelques modification j'ai moins d'erreurs:
preferences.c(110) : warnin
g C4013: 'strtok_r' undefined; assuming extern returning int
preferences.c(110) : warnin
g C4047: '=' : 'char *' differs in levels of indirection from 'int'
preferences.c(110) : warnin
g C4047: '=' : 'char *' differs in levels of indirection from 'int'
Linking toto_win32_vc8.exe...
preferen
ces.obj : error LNK2019: unresolved external symbol _strtok_r referenced in func
tion _wpreferencesrrt
Ses erreurs se porte sur la ligne de code:
Code:for (word=strtok_r(param, " ", &mem), i=0; word != NULL; word=strtok_r(NULL, " ", &mem), i++)
Le #include <string.h> est ajouté
Il ne connait pas la fonction 'strtok_r' .
C'est une fonction non standard et peut être que ton compilateur n'en dispose pas. Vérifie dans la documentation qu'elle existe et dans ce cas quel include il faut faire (apparemment ce n'est pas <string.h>) et quelle bibliothèque utiliser pour l'édition de liens.
J'ai regardé sur le net et j'ai vu quelle dans la bilbliothèque qu'elle est utilisé,
Sinon tu fais référence à quelle documentation?
Sinon ya til un autre moyen pour contourner l'utilisation de strtok_r?
Celle de ton compilateurCitation:
Sinon tu fais référence à quelle documentation?
Dans le code que tu présentes, strtok(), qui est standard, devrait faire l'affaire.Citation:
Sinon ya til un autre moyen pour contourner l'utilisation de strtok_r?
C'est quoi la différence entre strtok() et strtok_r?
en utilisant le code comme suit pour récupérer chaque mot dans une "case" j'ai une "access violation writing location ...." qaand je rentre dans la fonction strtok.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 const char *param; char *word; int i; char* chaine[2]; param = "une chaine"; for (word=strtok(param, " "), i=0; word != NULL; word=strtok(NULL, " "), i++) { chaine[i]=word; }
Au fait, c'est parce qu'il ne faut pas utiliser une constante mais un char str[] par exemple.
Mais dans ce cas comment faire lorsque l'on a a disposition qu'un const *char.
Ya til moyen de le convertir en string?
Dans ton cas, il faut que la chaine soit modifiable puique strtok() va vouloir remplacer le séparateur par 0. Par exemple :
param est alors un tableau modifiable initialisé par la chaine "une chaine"Code:char param[] = "une chaine";
Dans le code :
param est l'adresse de la chaine non modifiable "une chaine" stockée quelque part ailleurs.Code:
1
2
3 const char *param; ... param = "une chaine";
Merci bien, j'ai compris le fonctionnement