[C] Pb chaines de caractères

Pb chaines de caractères [C] - Programmation

Marsh Posté le 28-01-2001 à 17:04:02    

Bon, vous moquez pas :) Voila ou ca couille :
 
 
//
printf("
--Votre article--

 

" );
   printf("nom : " );
   scanf(" %s",t[i].nom);
 
 
   printf("
prix : " );
   scanf(" %lf",&t[i].prix);
 
 
   printf("
reference : " );
   scanf(" %s",t[i].ref);
 
   t[i].existe=1;
//
 
c'est au sein d'une fonction que j'ai appele create_article qui prend un tableau d'article en parametre. article étant un typedef struct :
 
typedef struct
 {
   int existe;
   char *nom;
   double prix;
   int reste;
   char *ref;
        }article;
 
Donc ca merdouille au niveau des chaines de caractères ref et nom. Ma chaine de caractère nom se retrouve mixé avec la chaine de caractère ref, ce qui est embetant, ca fait 2/3 heures que je suis dessus, et je comprends pas, si une ame charitable passe par la :)), merci d'avance

 

--Message édité par Evadream -jbd---

Reply

Marsh Posté le 28-01-2001 à 17:04:02   

Reply

Marsh Posté le 28-01-2001 à 17:13:35    

Autre chose, le code qui apparait ici est celui situé juste apres un for qui s'arrete sur une valeur de i bien choisie.
 
Merci !

Reply

Marsh Posté le 28-01-2001 à 17:37:53    

scanf(" %s",t[i].ref);ss
 
ref est déclaré en int, ça explique peut-être le pb

Reply

Marsh Posté le 28-01-2001 à 18:05:40    

Ouaip, merci, mais c'était un mauvais copier coller, c'etait une ancinne version, je corrige ca ds le post
 
Merci qd meme !

Reply

Marsh Posté le 28-01-2001 à 18:11:26    

Ta structure n'a pas de place pour stocker un nom !
Donc quand tu rentres le nom ça deborde sur les "champs" suivants.

Reply

Marsh Posté le 28-01-2001 à 18:13:59    

Ok, mais pourquoi elle a pas de place ? Pourtant j'initialise mes deux pointeurs ( à l'aide d'une fonction qui s'execute avant ) comme suit :
 
t[i].nom=(char*)malloc(sizeof(char));
t[i].ref=(char*)malloc(sizeof(char));
 
Comment donner plus de place pour stocker "nom" ?
 
Merci du temps que vous m'accordez tous

Reply

Marsh Posté le 28-01-2001 à 18:20:35    

Ben tu mets:
char nom[9] si tu veux mettre une chaîne de 8 caractères (+'';) au max.
 
En fait le mieux est de faire le scanf sur une chaine temporaire, verifier si la taille est < 9 puis la copier dans t[i].nom.

Reply

Marsh Posté le 28-01-2001 à 18:23:42    

Ok, merci ! Mais je pensais qu'on pouvait ne pas se soucier de la taille d'une chaine de caractere avec une declaration du type
char *chaine_de_caracteres
 
Donc la, apparement, il s'agit d'un probleme de débordement, tout simplement ?
 
Y'a moyen de savoir jusqu'ou on peut aller avec cette limite, ou est-ce purement aleatoire ?

 

--Message édité par Evadream -jbd---

Reply

Marsh Posté le 28-01-2001 à 18:30:34    

Et sinon, d'une manière générale, une déclaration du type char *qqchose est à éviter pour manier des chaines de caractères ?

Reply

Marsh Posté le 28-01-2001 à 18:48:27    

Hum :D
 
j'ai change ma struture :
 
typedef structss
{ss
ss int existe;ss
ss char nom[10];ss
ss double prix;ss
ss int reste;ss
ss char ref[10];ss
ssssssss}article
 
et lorsque je veux "inititaliser" mon tableau de structure article :
 
t[i].nom="0";
 
par exemple, le compilo me dit qu'il attend une lvalue. Mais je ne comprends pas. Mettons que i ( qui a une valeur à la sortie d'une boucle ) vaut 5.
 
Je veux qu'à la cinquieme case de mon tableau d'article, le champ nom soit affecté par le caractère "0".
 
t[i].nom ne désigine t'il pas le champ nom de la structure se situant à la 5eme case du tableau ?
 
Si oui, je ne vois pas pourquoi t[i].nom="0", bloque.
 
Si qqun pouvrait m'expliquer..

Reply

Marsh Posté le 28-01-2001 à 18:48:27   

Reply

Marsh Posté le 28-01-2001 à 18:53:39    

Pour pouvoir faire t[i].nom = "0", il faut que nom soit un char* :D
 
Sinon, il faut faire strcpy(t[i].nom,"0" )

 

--Message édité par Verdoux--

Reply

Marsh Posté le 28-01-2001 à 18:55:45    

hum, j'ai pas le droit d'utiliser string.h :( Je sais, c débile, obliger de réinventer la roue à chaque fois... )

 

--Message édité par Evadream -jbd---

Reply

Marsh Posté le 28-01-2001 à 19:01:53    

Tu peux alors toujours l'initialiser avec:
t[i].nom[0]='0';
t[i].nom[1]='/0';

 

--Message édité par Verdoux--

Reply

Marsh Posté le 28-01-2001 à 19:51:42    

houla la gaffe monstrueuse !
 
t[i].nom=(char*)malloc(sizeof(char));
 
la t aloue juste une char soit un octet !!!!!!!!!
(sizeof(char) va te renvoyer 1 )ss
 
la syntaxe correcte est :
 
t[i].nom=(char*)malloc(k*sizeof(char));
où k est le nombre de char que tu veux allouer (20 par exemple)
 
ou ta appris a programmer toi ? ;)

Reply

Marsh Posté le 28-01-2001 à 19:54:45    

et o fait Verdoux -> c pluto :
t[i].nom[0] = '' ou équivalent t[i].nom[0] = 0
 
A+

Reply

Marsh Posté le 28-01-2001 à 20:02:45    

A vi j'ai mollé le \

Reply

Marsh Posté le 28-01-2001 à 21:05:45    

Oggy_le_caffard, j'ai le même pb en allouant de la mémoire pour 20 caractères

Reply

Marsh Posté le 28-01-2001 à 21:06:08    

c'est plus souple d'utilise les char * en utilisant un tampon!
Exemple:
 
char * getstring(char *buffer)
{   char *e;
 e=(char *)malloc((1+strlen(buffer))*sizeof(char));
 strncpy(e,buffer,1+strlen(buffer));
 return(e);
}
main()
{
 char* nom;
 char* tampon=(char*)malloc(1024*sizeof(char));//ou char tampon[1024];
 
 printf("
 nom:" );
 scanf("%s",tampon);
 nom=getString(tampon);
}

 

--Message édité par Roswell_--

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed