Problème boucle For
Résolu
Romain
-
Romain -
Romain -
Bonjour,
Ayant l'habitude du .NET, je suis assez désorienté en C.
Ainsi je souhaiterais parcourir une boucle pour extraire les données d'un objet.
Voici ce que je souhaiterais faire ne langage algorithmique :
J'ai un objet tag_t qui va contenir des statuts : Attente, Préparation, Expedition, Livré.
Par exemple mon objet tag_t[1] va contenir Attente, et mon objet tag_t[2] contiendra : "Attente","Préparation".
Je souhaite donc extraire les statuts grace à une boucle, les stocker dans une variable et effacer par la suite :
J'espère que j'ai été assez clair,
j'arrive bien a faire la boucle, mais cx'est "Mavariable qui me pose problème, pour ajouter les statut et les concaténer à l'interieur. J'ai bien essayé strcat() mais je n'ai pas réussi....
En vb ou c# c'est tellement facile ! mais là je sèche.
Dans l'attente de vos réponses,
Cordialement
Ayant l'habitude du .NET, je suis assez désorienté en C.
Ainsi je souhaiterais parcourir une boucle pour extraire les données d'un objet.
Voici ce que je souhaiterais faire ne langage algorithmique :
J'ai un objet tag_t qui va contenir des statuts : Attente, Préparation, Expedition, Livré.
Par exemple mon objet tag_t[1] va contenir Attente, et mon objet tag_t[2] contiendra : "Attente","Préparation".
Je souhaite donc extraire les statuts grace à une boucle, les stocker dans une variable et effacer par la suite :
Pour i=0 jusqu'à nb_objets faire QRY_OBJET(tag_t[i], nb_statuts) QRY_LIST(tag_t[i],status_list) Pour j=0 jusqu'à nb_statuts faire QRY_STATUT(status_list[j]) MaVariable = Mavariable + statut Fin Pour Fin Pour fprint("Les statuts sont : %s", Mavariable); Mavariable= nothing //"destruction" ou "réinitialisation" de la variable
J'espère que j'ai été assez clair,
j'arrive bien a faire la boucle, mais cx'est "Mavariable qui me pose problème, pour ajouter les statut et les concaténer à l'interieur. J'ai bien essayé strcat() mais je n'ai pas réussi....
En vb ou c# c'est tellement facile ! mais là je sèche.
Dans l'attente de vos réponses,
Cordialement
A voir également:
- Problème boucle For
- Downloader for pc - Télécharger - Téléchargement & Transfert
- Idm for mac - Télécharger - Téléchargement & Transfert
- Copytrans heic for windows - Télécharger - Visionnage & Diaporama
- Instagram for pc - Télécharger - Divers Communication
- Microsoft store download for pc - Guide
7 réponses
Il faut dire que tu ne t'attaque pas à la partie la plus simple du C : les chaines de caractères. Avant, il vaut mieux avoir bien compris la notion de tableau et de pointeur. Le problème viens des 2 premières lignes :
char *temp1; tu déclares un pointeur de char
temp1="" outre qu'il manque le ";", tu fais pointé temp1 vers la chaine de caractère constante "", ce qui cause le problème, car par la suite tu ne peux plus modifier ce qu'elle contient.
à mon avis, la meilleur solution pour toi est de définir un tableau :
char temp1[1024]; // mai tu mettre autre chose comme taille.
puis temp1[0]='\0'; comme initialisation afin que strcat fonctionne correctement.
char *temp1; tu déclares un pointeur de char
temp1="" outre qu'il manque le ";", tu fais pointé temp1 vers la chaine de caractère constante "", ce qui cause le problème, car par la suite tu ne peux plus modifier ce qu'elle contient.
à mon avis, la meilleur solution pour toi est de définir un tableau :
char temp1[1024]; // mai tu mettre autre chose comme taille.
puis temp1[0]='\0'; comme initialisation afin que strcat fonctionne correctement.
Si je peux me permettre, j'ajouterai aussi que :
est erroné, même si ton compilateur ne te dit rien (en fait, un compilateur bien intentionné devrait émettre un warning, du moins gcc le fait avec les options de compilation -Wall, qui moi me dit "comparison with string literal results in unspecified behavior"), même s'il n'empêche pas la compilation. En faisant cela, tu compares l'adresse mémoire du pointeur release_status_type (c'est un pointeur sur char), à un littéral.
Si tu veux faire une comparaison de chaînes en C, c'est à la fonction strcmp que tu dois recourir, donc normalement :
http://www.cplusplus.com/reference/cstring/strcmp/
Cependant, si tu extrapoles les (excellentes) explications de Char Snipeur, dans le cas présent, tu t'es peut-être aussi rendu compte, que tu pourrais obtenir le même résultat, en testant si le premier caractère du tableau de caractères accessible à l'index 0 est égal au caractère '\0', car cela indique une chaîne vide. Et là, en revanche, tu peux légalement écrire :
En fait, un char (un caractère) est un type d'entier en C, et on peut le comparer avec les opérateurs de comparaison à la valeur du caractère '\0'. Note que, comme c'est un caractère, il est entouré d'apostrophes, et non de guillemets.
Dal
if (release_status_type != ""){
est erroné, même si ton compilateur ne te dit rien (en fait, un compilateur bien intentionné devrait émettre un warning, du moins gcc le fait avec les options de compilation -Wall, qui moi me dit "comparison with string literal results in unspecified behavior"), même s'il n'empêche pas la compilation. En faisant cela, tu compares l'adresse mémoire du pointeur release_status_type (c'est un pointeur sur char), à un littéral.
Si tu veux faire une comparaison de chaînes en C, c'est à la fonction strcmp que tu dois recourir, donc normalement :
if (strcmp(release_status_type, "") != 0){
http://www.cplusplus.com/reference/cstring/strcmp/
Cependant, si tu extrapoles les (excellentes) explications de Char Snipeur, dans le cas présent, tu t'es peut-être aussi rendu compte, que tu pourrais obtenir le même résultat, en testant si le premier caractère du tableau de caractères accessible à l'index 0 est égal au caractère '\0', car cela indique une chaîne vide. Et là, en revanche, tu peux légalement écrire :
if (release_status_type[0] != '\0'){
En fait, un char (un caractère) est un type d'entier en C, et on peut le comparer avec les opérateurs de comparaison à la valeur du caractère '\0'. Note que, comme c'est un caractère, il est entouré d'apostrophes, et non de guillemets.
Dal
Salut.
C'est un peu trop abstrait pour te donner une réponse.
Si c'est du C (et non du C++) il faut bannir l'idée d'objet de ton esprit.
La gestion création, destruction se fait par malloc et free.
C'est un peu trop abstrait pour te donner une réponse.
Si c'est du C (et non du C++) il faut bannir l'idée d'objet de ton esprit.
La gestion création, destruction se fait par malloc et free.
Bonjour,
merci de ta réponse mais le souci n'est pas au niveau de l'objet (je ne sais pas si on peut appeller ca "objet" mais ça en a tout l'air. Je travaille avec des API et tag_t est fourni par une API mais ça j'arrive tres bien a le manipuler).
Ce que je n'arrive pas à faire c'est concatener. Tout bête me diras tu....
par exemple j'arrive à afficher temp1=statut. mais ça ne marche que pour 1 statut. je voudrais récuperer les statuts ddans la boucle et les mettre un par un dans MaVariable.
J'espere que tu m' as compris
ps : c'est bien du C.
merci de ta réponse mais le souci n'est pas au niveau de l'objet (je ne sais pas si on peut appeller ca "objet" mais ça en a tout l'air. Je travaille avec des API et tag_t est fourni par une API mais ça j'arrive tres bien a le manipuler).
Ce que je n'arrive pas à faire c'est concatener. Tout bête me diras tu....
par exemple j'arrive à afficher temp1=statut. mais ça ne marche que pour 1 statut. je voudrais récuperer les statuts ddans la boucle et les mettre un par un dans MaVariable.
J'espere que tu m' as compris
ps : c'est bien du C.
Si tu préfère, il me manque les types et les dimensionnement.
Comment déclare tu MAvariable ? En C, concaténer des chaines de caractère se fait avec strcat ou strncat.
Comment déclare tu MAvariable ? En C, concaténer des chaines de caractère se fait avec strcat ou strncat.
Ah oui désolé ...
Mais je doute que ce soit bon.
Avec char temp[100] ; j'avais essayé de faire en sorte que les statuts concaténés se retrouvent dans cette variable temp :
Je pense que mon problème vient de la déclaration des variables mais j'avoue que je suis un peu perdu...
Merci d'avance
char *MaVariable;
Mais je doute que ce soit bon.
Avec char temp[100] ; j'avais essayé de faire en sorte que les statuts concaténés se retrouvent dans cette variable temp :
strcat(temp, statut);mais sans succès.
Je pense que mon problème vient de la déclaration des variables mais j'avoue que je suis un peu perdu...
Merci d'avance
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Le plus simple serait de nous mettre un bout de code C, éventuellement simplifié.
Pourquoi sans succès ? Il se passe quoi ?
Quel est le type de "statut" ?
Pourquoi sans succès ? Il se passe quoi ?
Quel est le type de "statut" ?
Voici mon code très simplifié car c'est vraiment juste la variable temp1 dans laquelle je n'arrive pas a concatener des champs
:
Voilà je ne sais pas si ça te suffit mais le code en lui même fonctionne très bien, c'est jsute au niveau de la varible temp. Est ce que ce que je souhaites faire est impossible ? est ce qu'il faut procéder d'une autre maniere ou est ce moi tout simplement qui ne sait pas déclarer une variable...
merci pour ton aide
:
char *temp1;
temp1=""
for (j=0; j< status_count; j++){
irc = CR_ask_release_status_type(status_list[j], release_status_type);
if (release_status_type != ""){
//temp1= release_status_type; // en commentaire
strcat(temp1, release_status_type); // c'est ici que ca ne va pas
}
printf("voici ce que donne la concaténation : %s", temp1);
Voilà je ne sais pas si ça te suffit mais le code en lui même fonctionne très bien, c'est jsute au niveau de la varible temp. Est ce que ce que je souhaites faire est impossible ? est ce qu'il faut procéder d'une autre maniere ou est ce moi tout simplement qui ne sait pas déclarer une variable...
merci pour ton aide
A vrai dire je ne pensais absolument pas que manipuler des chars allait me poser problème...
Ta solution permet à mon programme de fonctionner correctement et je t'en remercie.
Cependant, j'aimerais comprendre pourquoi temp1[0]='\0'; change quelque chose ?
cela réinitialise toute la chaine temp1 (qui est vu comme un tableau). L'indice zéro est particulier ?
Encore merci pour le temps que tu m'as accordé
Ta solution permet à mon programme de fonctionner correctement et je t'en remercie.
Cependant, j'aimerais comprendre pourquoi temp1[0]='\0'; change quelque chose ?
cela réinitialise toute la chaine temp1 (qui est vu comme un tableau). L'indice zéro est particulier ?
Encore merci pour le temps que tu m'as accordé
strcat prend le premier argument et cherche la fin de la chaine pour écrire dedans le deuxième argument.
char tmp[100]; crée un tableau de char, mais on ne sais pas ce qu'il y a dedans tm[0]='\0'; dit que le premier caractère correspond à la fin de la chaine, c'est à dire que la chaine est vide, peu importe ce qu'il y a après en fait.
char tmp[100]; crée un tableau de char, mais on ne sais pas ce qu'il y a dedans tm[0]='\0'; dit que le premier caractère correspond à la fin de la chaine, c'est à dire que la chaine est vide, peu importe ce qu'il y a après en fait.