[Langage C] Problème pour réaliser une application

Répondre
Partager Rechercher
Bonjour je suis entrain de réaliser une petite application en C et j'ai un problème !
Mon programme a pour but de générer une référence d'un produit en indiquant plusieurs éléments.
L'utilisateurs doit donc rentrer plusieurs informations , et le code va lui générer une une référence.

J'ai donc cré une structure qui contient l'ensemble des informations nécessaire à générer la référence d'un produit !
Et j'aimerai stocké dans une variable ( tab[i].Ref ) , la concaténation de toute les valeurs entrée par l'utilisateur.
A savoir à la suite : Entity+Year+Project+Kind+Docnumber !

Pour imager , la variable Tab[i].Ref devrait avoir pour valeur : concaténation successive de Entity Year Project Kind Docnumber.
C'est à dire Tab[i].Ref <= Entity+Year+Project+Kind+Docnumber;

Malheuresement je ne connais pas la syntaxe pour faire ceci.
Cette référence doit être simplement au final une chaine de caractère !


Merci d'avance





Citation :

#include <stdio.h>



typedef struct Fiche {

int Entity;
int Year;
int Project;
char Kind[3];
int Docnumber;
char Ref[15];

}Fiche;

main()

{

Fiche tab[5];
char Test;
int i;
int j;


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

printf("Enter Entity (1,2,3) :\n");
scanf("%d",&tab[i].Entity);
printf("%d",tab[i].Entity);
printf("Enter Year (03 / 04 etc.) :\n");
scanf("%d",&tab[i].Year);
printf("Enter Project Number :\n");
scanf("%d",&tab[i].Project);
printf("Enter Kind of Project (3 char):\n");
scanf("%s",&tab[i].Kind);
printf("%s",tab[i].Kind);
printf("Enter Document Number:\n");
scanf("%d",&tab[i].Docnumber);

}



/* Code Manquant ici ! */




}

Je t'aide un peu si j'ai bien compris !

Tu veux transformer des nombres en chaine de caracteres...
tu veux concatener ces chaines pour n'en former qu'une qui sera ta reference.

transformer un nombre en chaine:
char temp[50];
sprinf(temp,"%d", tab[i].Entity);

c'est comme un printf...

Apres pour concater tout ca tu fais des :
strcat(ref, temp);

rien de bien compliqué

il doit y avoir moyen de jouer avec le sprintf :
sprinf(Ref,"%d", tab[i].Entity);
sprinf(temp,"%s%d", Ref, tab[i].Year);
sprinf(Ref,"%s%d", temp, tab[i].Project);
strcat(Ref,Kind);

Par contre ca sent le bug...

scanf("%s",&tab[i].Kind);

y'a pas de & c'est une chaine! une chaine est deja un pointeur char *

Quand tu rentres des donnees dans des char[] assure toi d'avoir la place!
rentre dans un temp[255], apres tu checks la taille :
scanf("%s",temp);
if (strlen(temp)<4) {
strcpy(Kind,temp);
}
else // print error!

et ton Kind doit etre un char[4] pour le 0 qui termine toute chaine de caractere!

J'espere ne pas avoir dit de connerie
Oui, avec sprintf, et tu peux meme tout faire en un seul coup en faisant un sprintf("%d%d%d%s", id, info, bidule, texte);

Attention au buffer overflow (surtout si c'est des utilisateurs qui rentrent les infos), tu peux utiliser snprintf pour vérifier que tu ne sors pas de la taille maximale du buffer (et eviter que des gens malveillants fassent planter ton programme, si il doit etre utilisé dans un environnement de production).
Citation :
Publié par Mothra
Oui, avec sprintf, et tu peux meme tout faire en un seul coup en faisant un sprintf("%d%d%d%s", id, info, bidule, texte);
Hola ! exact, j'suis tres con de pas y avoir pensé d'entrée... surtout que j'avais bien commencé

S.
Outre le fait que comme l'a fait remarquer Mothra, il faut faire attention aux buffer overflow, tu es conscient que le langage C est sûrement l'un des moins adaptés pour faire ce genre de choses ?

Lango, qui pense qu'il serait bien qu'un jour les gens arrêtent d'utiliser le C pour des programmes qui ont besoin d'un langage haut niveau.
Citation :
Publié par Lango
Outre le fait que comme l'a fait remarquer Mothra, il faut faire attention aux buffer overflow, tu es conscient que le langage C est sûrement l'un des moins adaptés pour faire ce genre de choses ?

Lango, qui pense qu'il serait bien qu'un jour les gens arrêtent d'utiliser le C pour des programmes qui ont besoin d'un langage haut niveau.
Je vois absolument pas en quoi un langage de haut niveau serait mieux adapté. (tout dépend de ce que tu entend par "de haut niveau")
En cobol ce serait sûrement bien plus rapide à gérer
On peut éviter les débats de langages? Le monsieur te dit qu'il fait son programme en C, c'est sa décision, peut-être qu'il a besoin d'un truc tout con en ligne de commande qui va générer un fichier après tout...
C'est vrai qu'il aurait du le faire en java, y'aurait surement eu + de 10k appel de methode de classe pour faire ca
(500 mini pour un simple print "hello" !)

C'est pas mal le C pour apprendre les bases. J'comprends pas comment on peut savoir coder efficacement ( en java , C++) si on ne maitrise pas un langage + bas niveau genre le C. On comprends mieux apres les optimisations & autres.
Point de vue purement personnel.
Citation :
Publié par Imperio
On peut éviter les débats de langages? Le monsieur te dit qu'il fait son programme en C, c'est sa décision, peut-être qu'il a besoin d'un truc tout con en ligne de commande qui va générer un fichier après tout...
Ce qui n'empèche pas que ça serait largement plus vite fait avec un langage haut niveau (perl, python, par exemple)

Citation :
Publié par Dracan Sakan
Je vois absolument pas en quoi un langage de haut niveau serait mieux adapté. (tout dépend de ce que tu entend par "de haut niveau")
J'entends un langage où tu n'as pas besoin de gérer la mémoire à la main.

Par exemple, dans le code proposé par sereg, une limitation à 50 caractères est introduite pour simplifier le code, sans documentation et sans vérifier si cette limite est dépasser. Ne pas introduire une telle limitation, et même simplement s'assurer qu'il n'y a pas de buffer overflow, alourdirait pas mal le code.

Pourtant, dans un langage qui gère les chaînes de caractères de manière satisfaisante, une telle limitation n'aurait pas lieu d'être, et le code serait à la fois plus simple et plus robuste.

Citation :
Publié par Sereg
C'est vrai qu'il aurait du le faire en java, y'aurait surement eu + de 10k appel de methode de classe pour faire ca
(500 mini pour un simple print "hello" !)
C'est vrai que system.print("hello"); ça fait 500 appels... (de mémoire, java n'est pas tellement mon langage de prédilection...)

Citation :
C'est pas mal le C pour apprendre les bases. J'comprends pas comment on peut savoir coder efficacement ( en java , C++) si on ne maitrise pas un langage + bas niveau genre le C. On comprends mieux apres les optimisations & autres.
Je suis tout à fait disposé à continuer la conversation là-dessus, mais ça va commencer à devenir très hors-sujet. Si j'ai le temps j'ouvrirai un nouveau sujet pour y répondre.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés