Rechercher : dans
Par :

Pointeur de string en C

Dernière réponse le 20 mai 2008 à 11:20:22 nico, le 20 mai 2008 à 10:42:17 
 Signaler ce message aux modérateurs

Bonjour,
je suis bloqué sur un programme en C

j'ai fait char** ptr;
ptr[0]="float";
if(ptr1[0]=="float") {
...
}

et là j'ai une erreur de segmentation
impossible de résoudre un problème qui parait si facile

Meilleures réponses pour « pointeur de string en C » dans :
Enregistrer une vidéo en streaming (Youtube, Dailymotion...) VoirDe plus en plus de sites diffusent du contenu vidéo en streaming, c'est-à-dire en diffusion à la demande. Ainsi, il est nécessaire d'être connecté pour pouvoir en lire le contenu, voire de se connecter à partir de la page diffusant le contenu...
Les files en langage C VoirLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un...
Les templates en C++ VoirIntroduction Avantages Inconvénients Quand utiliser des templates ? Que dois-je mettre dans les .hpp et dans les .cpp ? Convention de notations Quelques templates célèbres STL BGL Premiers pas Spécifications de templates Template par...
Les structures en langage C VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...
Langage C - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle ? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non. Ces structures conditionnelles peuvent être associées à des structures qui se répètent...

1

kilian, le 20 mai 2008 à 10:48:37

Salut,

Il faut lui allouer de la place à ton pointeur:

char **ptr;
int i;
ptr = malloc( sizeof(char *) * NB_POINTEURS_QUE_TU_VEUX);

ptr[0] = "prout";

if(strcmp(prt[0], "prout") == 0){
     //tout va bien
}

Et utilise strcmp au lieu de ==, parce que le == sur des char * ne fera que comparer l'adresse et non pas le contenu des chaines.

Répondre à kilian

3

daronmaster, le 20 mai 2008 à 10:58:28

Salut kilian,

tu crois pas que ton ptr[0]="prout" va planter ? toi non pluis tu n'as pas alloué de memoire ... lol

à moins que ... euh non je ne sais pas en fait là j'ai un trou de memoire, enfin bref il faut tester mais là je dois dire que j'ai un bug...

bon allé bonne journée

tchû

Répondre à daronmaster

6

kilian, le 20 mai 2008 à 11:05:12

Nan, plantera pô ;-)

ptr[0] est de type char * et la place du pointeur en lui même est bien allouée. Par contre le pointeur ne pointe sur rien puisque j'ai pas refait de malloc derrière.

Donc pour l'instant c'est l'équivalent d'un

char *tmp;

Et je peux le faire pointer sur ce que je veux:
tmp = "prout"

...sachant que prout est une chaine allouée dans une zone de la mémoire en lecture seule à l'initialisation de l'application. Sa place en elle même est déjà allouée et "prout" retourne une adresse vers cette chaîne de caractère (de type const char *).
Voilà donc c'est la même chose pour ptr[0].

Par contre ce que je ne peux pas faire ça:
char *tmp;
strcpy(tmp, "prout");

Car tmp ne pointe sur rien, donc il ne pourra pas recopier "prout", donc crak!
Et donc même chose pour ptr[0].
Pour faire un strcpy effectivement il faudrait faire comme tu as fait: en allouant chaque pointeur de ptr.

Répondre à kilian

9

daronmaster, le 20 mai 2008 à 11:08:14

Ah si prout ne fait pas crack alors blop ...
ok merci pour ce petit eclairci j'étais dans le flou (je passe mes exams alors la prog j'en bouffe de tout les cotés)

bon allé à la prochaine (d'ici cet été je poste sur le wifi (si tu t'en souviens))

tchû

Répondre à daronmaster

12

kilian, le 20 mai 2008 à 11:15:38

bon allé à la prochaine (d'ici cet été je poste sur le wifi (si tu t'en souviens))

Pour sûr! D'ailleurs j'ai dans l'idée, si je trouve le temps cet été, d'écrire un tuto sur une page perso sur comment écrire un driver Linux pour le wifi. Si ça t'interesse je te dirai quand ce sera fait...

Répondre à kilian

13

daronmaster, le 20 mai 2008 à 11:19:32

Ouais il faut voir,c'est sur que cela m'interesse mais il faut serieusement que je me plonge la dedans de plus près car là je n'ai fait que survolé et en plus sur windows xp, bon sur linux je préfère (je sais pas je me sens mieux quoi), je ne sais pas si tu peux m'envoyer des mail à partir du forum mais sinon c'est mon pseudo suivi de @ et du domaine fraçais de hotmail. voila (bouh pour la methode pour donner mon mail mais bon tu as compris)

Répondre à daronmaster

14

 kilian, le 20 mai 2008 à 11:20:22

Wep ou bien par mp :-)

Répondre à kilian

2

daronmaster, le 20 mai 2008 à 10:56:07

Normale tu n'as pas alloué de memoire :

ce que tu cherche à faire c'est un tableau de string :

char** ptr;

ptr = (char **)malloc(sizeof(char *)*LE_NOMBRE_DE_STRING_QUE_TU_VEUX_DANS_TON_TABLEAU);
ptr[0]=(char*)malloc(strlen("float")*sizeof(char) + 1);

strcpy(ptr[0],"float");

//et voila le tour est joué

if(strcmp(ptr[0],"float") == 0) { //pour la comparaison de 2 chaines utilise strcmp -> renvoie -1 si plus petit, 0 si idem
//1 si plus grand
...
}

//quand tu fais un malloc il faut faire un free alors tu fais à la fin de ton programme :

for(i=0;i<LE_NOMBRE_DE_STRING_QUE_TU_VEUX_DANS_TON_TABLEAU;i++){

free(ptr[i]);

}

free(ptr);

//attention ne le fais que si toute tes case de ton tableau ont "recu" un malloc sinon "segfault"

et voila j'espere t'avoir aider

tchû

Répondre à daronmaster

4

kilian, le 20 mai 2008 à 10:58:55

NB_POINTEURS_QUE_TU_VEUX
[....]
LE_NOMBRE_DE_STRING_QUE_TU_VEUX_DANS_TON_TABLEAU


Hihi.... ;-)

Répondre à kilian

5

daronmaster, le 20 mai 2008 à 11:01:14

Oauis je sais, pour moi une string c'est un char *... '-)

Répondre à daronmaster

7

kilian, le 20 mai 2008 à 11:06:30

Non c'est juste qu'on a eu la même idée de mêttre des noms de constantes macro gigantesque (un rien m'amuse)....
;-)

Répondre à kilian

8

nico, le 20 mai 2008 à 11:07:10

Merci
j'avais oublié les mallocs comme toujours depuis que je suis sur le java

Répondre à nico

10

daronmaster, le 20 mai 2008 à 11:09:50

Et oui java masque toutes ces allocations et grace à son garbage collector plus de free. ahhhhh JAVA ... enfin c'est un peu lourd comme langage ...

allé bon courage pour la suite

Répondre à daronmaster

11

lami20j, le 20 mai 2008 à 11:09:56

Salut,

par exemple

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
        char** ptr;
        char s[]="float";

        ptr=(char **) malloc(2*sizeof (char *));
        ptr[0]="float";
        ptr[1]=s;
        if(strcmp(ptr[1],"float")==0)
                printf("%s\n",ptr[0]);
        return 0;
}
--
106485010510997108

Répondre à lami20j