Problème boucle For
Résolu/Fermé
A voir également:
- Problème boucle For
- Downloader for pc - Télécharger - Téléchargement & Transfert
- Copytrans heic for windows - Télécharger - Visionnage & Diaporama
- Download instagram for pc - Télécharger - Divers Communication
- Idm for mac - Télécharger - Téléchargement & Transfert
- Whatsapp for pc - Télécharger - Messagerie
7 réponses
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
5 févr. 2013 à 14:27
5 févr. 2013 à 14:27
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.
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
Modifié par [Dal] le 5/02/2013 à 19:39
Modifié par [Dal] le 5/02/2013 à 19:39
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
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
5 févr. 2013 à 09:19
5 févr. 2013 à 09:19
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.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
5 févr. 2013 à 11:35
5 févr. 2013 à 11:35
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
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
5 févr. 2013 à 12:02
5 févr. 2013 à 12:02
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é
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
5 févr. 2013 à 15:16
5 févr. 2013 à 15:16
https://www.commentcamarche.net/contents/118-langage-c-les-chaines-de-caracteres
:-)
:-)
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
5 févr. 2013 à 15:23
5 févr. 2013 à 15:23
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.