[C] Chaine de caracteres

Résolu/Fermé
01nul - 23 déc. 2009 à 15:28
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 - 24 déc. 2009 à 14:33
Bonjour,

J'aimerais pouvoir initialiser un tableau de type char avec une variable et non en rentrant directement une chaine de caractère comme le montre l'exemple ci-dessous :

Ceci fonctionne :

for(i=0;i<TAILLE;i++) {
char chaine[] = "Bonjour";
printf("%s\n", chaine);
} // renvoie la chaine Bonjour i fois

Ceci ne fonctionne pas :

for(i=0;i<TAILLE;i++) {
char chaine[] = Tpers[i].numero;
printf("%s\n", chaine);
} // erreur

J'ai tout essayé et cherché sur des dizaines de sites mais je ne trouve aucune indication. Je suis coincé.
Ayez pitié de mon sort, pauvre petit programmeur débutant...

Merci !
A voir également:

10 réponses

{psycho.} Messages postés 101 Date d'inscription mardi 22 décembre 2009 Statut Membre Dernière intervention 4 septembre 2010 8
23 déc. 2009 à 17:13
Mmm, un peu plus de détails, le fichier complet, ou au moins la déclaration de ton tableau de structures?
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
23 déc. 2009 à 22:34
char chaine[] = Tpers[i].numero;
C'est sûr que cela va probablement poser un problème ;-)
Peut-être me trompè-je ? Mais pour moi il y a deux solutions:
- soit Tpers[i].numero est un entier et je pense que le compilateur ne doit pas pousuivre son travail,
- soit Tpers[i].numero est une 'chaîne et je ne serais pas surpris que le compilateur ne poursuivre pas son travail.
En clair, il faudrait que l'on en sache un peu plus sur Tpers[i].numero.
Bonne continuation.
0
Bonjour et merci de votre implication.

Un extrait de mon tableau Tpers :

PERS Tpers[]={
{"MARTIN","Pierre","1720665005002"},
{"DUVAL","Jean","1700456126022"},
{"DURAND","Alain","1751265678031"}
...

Et voici la structure :

typedef struct personne{
char nom[LG_MAX]; /* nom de la personne */
char prenom[LG_MAX]; /* prénom de la personne */
char numero[LG_INSEE+1];/* numéro de la personne */
} PERS;

Je suis toujours bloqué sur le problème.
Tpers[i].numero n'est pas un entier, c'est une chaine. Et j'aimerais que chaque caractère de cette chaine se retrouve dans mon tableau chaine[]...
0
Bonjour et merci pour votre implication !

Voici mon tableau Tpers :

PERS Tpers[]={
{"MARTIN","Pierre","1720665005002"},
{"DUVAL","Jean","1700456126022"},
{"DURAND","Alain","1751265678031"},

Et voici ma structure :

typedef struct personne{
char nom[LG_MAX]; /* nom de la personne */
char prenom[LG_MAX]; /* prénom de la personne */
char numero[LG_INSEE+1];/* numéro de la personne */
} PERS;

Tpers[i].numero est donc une chaine et non un entier. Je voudrai que chaque caractère de cette chaine se retrouve dans mon tableau chaine[]...
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
24 déc. 2009 à 14:33
J'arrive sans doute après la bataille... mais je vais glisser un grain de sel. Le n° INSEE peut parfaitement se traiter comme un entier (par exemple un 'long long int' de 8 octets), ce qui permet une comparaison beaucoup plus simple. Tout dépend des autres traitements que l'on désire faire !
Mais ce n'est qu'un simple grain de sel.
Bonne continuation.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Salut,

#include<stdio.h>
#include<stdlib.h>
#define TAILLE 3
typedef struct personne{
char nom[50]; /* nom de la personne */
char prenom[50]; /* prénom de la personne */
char numero[2020];/* numéro de la personne */
} PERS;

int main()
{
int i;
char *chaine;
PERS Tpers[]={
{"MARTIN","Pierre","1720665005002"},
{"DUVAL","Jean","1700456126022"},
{"DURAND","Alain","1751265678031"},
};

for(i=0;i<TAILLE;i++) {
chaine =(char*) &Tpers[i].numero;
printf("%s\n", chaine);
}
return EXIT_SUCCESS;
}
0
Ok merci lami20j,

Cela me permet d'afficher la liste des numéros de toutes les personnes.
Cependant, je n'arrive pas à mettre chaque caractère d'un numéro dans un tableau chaine[].

En réalité, j'aimerais savoir si un numéro à 2 chiffres en entrée est présent dans un numéro de personne à un position donnée.

Exemple : le numéro 77 est il présent dans le numéro personne 1720665005002 (celui de Pierre MARTIN) ?

Difficulté supplémentaire : il faut que le numéro recherché soit en 6ème et 7ème position. Pour Pierre par exemple, c'est le numéro 65. Et 65 est différent de 77. Donc le retour est négatif.

Extrait de code :

printf("\nTaper un numero a 2 chiffres : ");
scanf("%d",&number);

char *chaine;
for(i=0;i<nb_pers;i++) {
chaine = (char*) &Tpers[i].numero;
// que mettre ici ?
}

J'essaie d'être le plus clair possible. Merci de votre aide.
0
chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
24 déc. 2009 à 11:13
Salut,
tu peux essayer la fonction strncmp...avec l'include qui va bien:#include<string.h>
for(i=0;i<nb_pers;i++) {
// que mettre ici ?
if (strncmp((char*)&Tpers[i].numero[6],"chaine_de_comparaison",2)==0)
printf("ok\n");
else
printf("ce nombre n'appartient pas à la chaine!!\n");
}
0
Salut,

Si tu ne veux pas utiliser strncmp tu peux essayer comme ça

#include<stdio.h>
#include<stdlib.h>
#define TAILLE 3
typedef struct personne{
char nom[50]; /* nom de la personne */
char prenom[50]; /* prénom de la personne */
char numero[2020];/* numéro de la personne */
} PERS;

int main()
{
int i,number,x,y;
char *chaine;
PERS Tpers[]={
{"MARTIN","Pierre","1720665005002"},
{"DUVAL","Jean","1700456126022"},
{"DURAND","Alain","1751265678031"},
};

do{
printf("\nTaper un numero a 2 chiffres : ");
scanf("%d",&number);
while(getchar()!='\n');
}while(number<10 || number >99);

x=number/10;
y=number%10;
for(i=0;i<TAILLE;i++) {
chaine =(char*) &Tpers[i].numero;
if(chaine[5]==x+'0' && chaine[6]==y+'0')
printf("%s => %c et %c\n",chaine, chaine[5],chaine[6]);
else
printf("%s => %d ne corresponds pas\n",chaine,number);
}
return EXIT_SUCCESS;
}
0
Ok problème résolu grâce à la technique de lami20j. Merci lami20j.
Je ne suis pas arrivé avec la technique de chuka (comparaison de chaines avec strncmp).
Surement que je ne suis pas encore assez bon.

En tout cas merci à tous pour votre aide qui m'a été précieuse et qui m'aura bien aidé à avancer.
Et merci pour votre rapidité de réponse.

A+

PS : il me reste à attaquer les listes chainées et l'allocation dynamique de mémoire... Snif !!
0
Salut,

il me reste à attaquer les listes chainées

Pour les listes chaînée tu peux jeter un coup d'oeil dans la FAQ liste simplement chaînée
0