Tom's Guide > Forum > Programmation > Problème en C

Problème en C

Forum Programmation : Problème en C

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

Bonsoir tout le monde

Voila j'ai un problème

J'avais fais un truc simple qui marché et quand je refais la compilation tout est ok mais quand je tape le prenom sa fais rapport d'erreur

Voila le code : ( je travaille avec dev-C++ )

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char *argv[])
  4. {
  5.   char szPrenom;
  6.  
  7.   printf("Entez votre prenom : \n" );
  8.   scanf("%s", szPrenom);
  9.  
  10.   printf("Votre prenom est : %s \n" );
  11.  
  12.   system("PAUSE" );
  13.   return 0;
  14. }



Et par la meme occasion je voudrais savoir comment afficher une chaine de caractere avec un if ou un swtich

Exemple :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char *argv[])
  4. {
  5.   char szPrenom;
  6.  
  7.   printf("Entez votre prenom : \n" );
  8.   scanf("%s", szPrenom);
  9.  
  10.   if (szPrenom == 'sliverman')
  11.   {
  12.     printf("Bien joué" );
  13.   }
  14.   else
  15.   {
  16.       printf("Perdu" );
  17.   }
  18.  
  19.   system("PAUSE" );
  20.   return 0;
  21. }



Au lieu de mettre un chiffre a la place de sliverman parce que si il faut mettre que du numerique dans les if sa serait pas top


Merci d'avance

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

Oulah t'es pas bien révéillé toi ^^

Citation :

char szPrenom;


Tu déclares UN caractère et t'essayes de mettre une chaîne dedans?

Ensuite pour une comparaison de chaine faut utiliser une fonction du type strcmp(); sinon, je pense que ca ne marchera pas.

Répondre à Rakipu

Hello, oui précise char szPrenom[20]; p.ex et le compilateur réserve 20 octets à partir de l'adresse szPrenom...
à+

Répondre à someoneelse@IDN

Citation :


silverman a écrit :
printf("Votre prenom est : %s \n" );



Egalement un pb pour afficher la chaine de charactère szPrenom, il faudrait que tu fasses un printf("Votre prenom est : %s \n",szPrenom);

car il faut préciser quelle variable de type char tu comptes afficher :D

Répondre à pp331

et maintenant, ca fait quoi si le mec met plus de 20 caractères dans son prenom?

Répondre à Boo28
- 0 +

ben tu lui met un message d'erreur genre "arrete de foutre la merde et met pas plus de 20 lettres dans ton sale pseudo de nolife de boulet!!!!"...^^

Répondre à Sliv

Citation :

et maintenant, ca fait quoi si le mec met plus de 20 caractères dans son prenom?


Segmentation fault, probablement :D
A la limite ya qu'à faire de l'allocation dynamique; au fur et a mesure que tu lis la chaîne dans le tampon caractère par caractère tu realloc plus de place, et à la fin tu rajoutes le '\0' et voila!
Et on free(); la mémoire quand on en a plus besoin.

Répondre à Rakipu

Bonjour

Citation :

if (szPrenom == 'sliverman')


Oui, pour comparer 2 chaines, utilise la fonctions strcmp(); de la bibliothèque "string.h"

Ensuite, tu peux faire

Code :
  1. char* szPrenom = NULL; // toujours initialiser un pointeur
  2. szPrenom = (char*) malloc ( sizeof(char) * nb_carac);


sans oublier d'inclure "malloc.h"

Bibop

Répondre à appel_moi_joe

strcmp retourne un entier

< 0 si la premiere chaine est plus petite,

= 0 Si les deux chaines sont identiques,

> 0 Si la premiere chaine est plus grande.

Répondre à MouT59

Citation :

strcmp retourne un entier

< 0 si la premiere chaine est plus petite,

= 0 Si les deux chaines sont identiques,

> 0 Si la premiere chaine est plus grande.


Merci de la précision ^^

Bibop

Répondre à appel_moi_joe

Code :
  1. szPrenom = (char*) malloc ( sizeof(char) * nb_carac);



vire moi ce (char *) l'utilisation du cast est inutile avec un malloc. Et je ne pense pas que ce sois utile de faire un sizeof(char) vu que ça vaut 1.

Sinon c'est moyen moyen d'utiliser scanf, pour une saisie de caractères. Mieux vaut utiliser fgets et virer le '\n' aprés preuve

Citation :

sans oublier d'inclure "malloc.h"



Gnè ? malloc est défini dans stdlib.h

Répondre à tebonb

t'

Citation :


tebonb a écrit :
malloc est défini dans stdlib.h



T'es sur ... je croyais qu'il n'était que dans ''malloc.h''.. ça me parait byzare... je vérifie tout de suite.

Répondre à pp331

autant pour moi ... désolé :-o

Répondre à pp331

Alors, il est vrai que le cast n'est pas obligatoire cependant, je prefere le mettre. La fonction malloc() retourne un void(*). Dans ce cas, le cast est utile car il permet de forcer le type de l'adresse de retour, ça permet de dire "je renvoi un pointeur sur une chaine de caractères", c'est plus propre : cela évite au compilateur de trouver tout seul le type de donner en retour.

Ensuite, il faut utiliser un sizeof car d'un ordinateur à un autre les données ne sont pas encodées sur le même nombre de bits.
Exemple : pour les entiers certains systemes vont allouer 2 octets et d'autre 4 octets... le systeme alloue ce qu'il a besoin.
Alors effectivement, pour les caractères ça n'est pas indispensable étant donné qu'il sont toujours sur un octet... cependant je trouve que ça fait plus "propre" et ça permet d'avoir une définition homogène et globale de la fonction.

ps : petite note personnel à "tebonb" ... merci de respecter les autres... Evites de te prendre pour une brute qui maîtrise tous mieux que tout le monde en utilisant des termes comme "vire moi" ou "gnè" ... je ne te connais pas, tu ne me connais, ayont une discution courtoise ... merci :-D

Répondre à appel_moi_joe

Beuh ? Quelqu'un a trouvé que j'étais une brute dans mes propos ? Je respecte tout le monde et je vois pas le rapport avec les termes "vire moi" et "gne", je vois pas ce que tu me reproches. En même temps, ce que je dis là, j'ai vu des programmeurs le répéter, répéter et rerépéter et j'ai jamais dit que je maîtrise tout mieux que les autres et c'est pas mon but de le montrer, c'est pas pour moi, c'est pas pour aider. Je prends la peine de donner des liens explicant ce que je dis, j'en ai meme encore un trés fiable au sujet de malloc.

Répondre à tebonb

Bonsoir,

Tu n'es pas brute dans tes propos, je me suis mal exprimé, mais je t'ai trouvé un peu offensant c'est tout. Désolé si tu l'as mal pris, je ne cherche en aucun cas le conflit :-P. En fait, il y a autant de façons de programmer qu'il y a de developpeur (enfin j'espere pas quand meme ;-) ) et tout le monde y va de sa petite sauce... concernant le malloc, je veux bien te croire volontier. Cependant moi, je prefere caster... alors après on peu parler de chipotage car au final, ça ne change pas grand chose quand même :-D.

Pour en revenir au sujet, je pense que silverman à toutes les cartes en main pour programmer sa petite application maintenant :-D

Bibop

Répondre à appel_moi_joe

Ok ce n'est pas grave, il y a plusieurs méthodes de programmer mais mieux vaut prendre les meilleurs je pense. Pour le malloc, tu peux caster si tu veux mais il y aura pas de différence, c'est implicite tfacon mais chacun ses habitudes. Bonne continuation à toi

Répondre à tebonb

Caster (ou transtyper pour éviter le pseudo anglais) un malloc c'est tout à fait possible. Disons qu'il s'agit là de la façon puriste, disons pour savoir exactement ce que l'on veut en retour (peut-être mieux pour débogger le programme).

Maintenant en effet "strcmp" est la fonction qui permet de comparer deux chaines (un man strcmp pourra certainement t'aider afin de savoir exactement comment ça marche mais je crois que tu as déjà des éléments de réponses ici même).

Et le "malloc" (encore une fois man malloc pourra te renseigner) me semble pas mal. Cela dit, les puristes encore eux, vérifirons la valeur de retour du malloc pour savoir si il renvoie NULL, tout ça dans le but de blinder le programme lors de l'exécution (évite les segmentation fault) et pas lors de la compilation qui ne vérifie rien à ce propos.

Voilà

Bye

Répondre à keyser_fr

clap clap clap keyser a remis les choses au clair :-D

Répondre à pp331

Personnellement je sors d'un DUT Info et on m'a toujours appris a caster le malloc ...

Répondre à MouT59

Bah tu peux caster, mais moi je trouve que c'est inutile et ce lien le dit aussi

Répondre à tebonb

Citation :

Pointeur générique, le type void*, cast

« void » signifie vide, c'est un type indéfini, son utilisation principale est d'en faire un pointeur dit « générique 3 » à savoir un pointeur indépendant de tout type en particulier. Un tel pointeur permet de manier l'adresse mémoire d'un objet dont on ignore le type.

Par exemple la fonction malloc() va être utilisée dans le programme pour n'importe quel type d'objet, int*, char*, float* etc. et notamment pour des adresses mémoire de structures créées par le programmeur. Il faut donc que la fonction puisse allouer de la mémoire pour n'importe quel type d'objet y compris des structures inventées par le programmeur. Pour cette raison la fonction malloc renvoie un pointeur générique, c'est-à-dire tout simplement une adresse mémoire qui correspond à une zone de mémoire de la taille en octets passée en argument à la fonction.

En général le retour de la fonction malloc est ensuite forcé au type de l'objet souhaité par un « cast ». C'est une opération qui permet de transformer le type générique dans le type de l'objet souhaité. Avec cette modification de cast l'appel de la fonction malloc devient :

ptr = ( T* ) malloc (sizeof( T )) ;

Un type placé entre parenthèse à gauche du retour de la fonction transforme celui-ci dans ce type. Si par exemple T est int on a :

ptr=(int*)malloc(sizeof(int)) ;

ce qui signifie que ptr est un pointeur de type int*.

Bien que le cast ne soit pas obligatoire il est toutefois préférable parce qu'il donne la possibilité au compilateur de vérifier la bonne adéquation des types dans le programme au moment de la compilation.



tiré de : fdr.free.fr/alldocs/4%20ateliers/creat_lang1/8%20Pointeurs/8%20Pointeurs.rtf

Moi aussi je peux trouver des liens ^^... Maintenant je pense que l'on a fait le tour... Stop :-D... on radote comme de vieux séniles lol

Bibop

Répondre à appel_moi_joe

Exact, on a deux liens opposés, mais je ne mettrai pas le cast avec un malloc. C'est clair qu'il est inutile de continuer à discuter sur le sujet c'est chacun son point de vue.

Répondre à tebonb

Bonjour à tous,

Pour commener le prototype de la fonction malloc () est défini à la fois dans le fichier stdlib.h et dans malloc.h donc sur ce sujet là tout le monde a raison. (Regarder dans MSDN pour vérifier, enfin pour ceuw qui l'ont).

Ensuite pour le grand débat sur le cast...
Pour le malloc il n'est pas obligatoire, mais il est préférable d'apprendre correctement à programmer aux gens afin qu'ils prennent de bonne habitude depuis le début et qu'ils évitent de faire des choses qui marchent sans vraiment comprendre ce qui se passe, enfin c'est la philosophie que j'ai lorsque j'enseigne à mes étudiants

Bouh343

Répondre à celibataire

en c++ c'est quand même + simple

#include <iostream>
#include <string>

using namespaces std;

int main(int argc, char *argv[])
{
string szPrenom = null;

cout << "Entez votre prenom :" << endl;
cin >> szPrenom;

if (szPrenom == 'sliverman')
cout << "Bien joué";
else
cout << "Perdu";

system("PAUSE" );
return_succes;
}

;-)

Répondre à poussinphp

Je pense que ce code à peu, pour ne pas dire aucune, chance de tourner ...

Bibop

Répondre à appel_moi_joe

bonjour à tous,

poussinphp, peut tu nous rappelé l'utilité de

Code :
  1. using namespaces std;

s'il te plait?
ensuite tu initialise une chaine a null ??!!!

Code :
  1. if (szPrenom == 'silverman')


cout << "c'est n'importe quoi" << end;
on ne compare pas deux chaines de caractères dans un if, mais il faut se servir de la fonction strcmp() mais cela a deja été dit plus haut.

Heu.... return_succes il sort d'où? du frigo? et ta fonction main ne retourne rien du tout vu qu'il n'ya pas le mot clé <b>return</b>

Enfin, par pitié.... ayant de la compassion pour les professeurs... arreter de dire que vous faites du C++ parce que vous utiliez cin, cout... s'il vous plait...
Ca nous pique les yeux !!!
Le principe du C++ est l'objet, avec des concepts qui en decoule (héritage, polymorphisme....) et dans ton code poussinphp je ne vois ni classe ni d'objet ni quoique se soit de ce genre..

bouh343

Répondre à celibataire

1) using namespace std;
sans ça t'ecrit :
std::cout <<.....
avec t'ecrit:
cout<<

2) Le language C++ admet comme condition du if les paramètres contenu dans les ( et ). Ce qui ce trouve après est executé. si il y a plusieures lignes de codes après on met { et }. je les aient pas mis car ça alourdis le code (j'avais mais des espacements pou indenter mais sont aprti lors du post) et qu'il y a qu'une seule instruction après le if.

3) Ensuite pour du c++, ça puissance c'est les classes (poo) mais c'est pas obligé.

un ptit exemple (on me dit que je sait pas faire du c++) :-P

dans main.h dans le ifndef (la fleme de tout ecrire lol)

class toto{
toto();
~toto();
int ecrire(char*);
};

dans main.cpp

toto::toto()
{
// constructeur
}

toto::~toto()
{
// destructeur
}

int toto::ecrire(char *)
{
// lignes
return 1;
}

int main(....)
{
toto titi* = new toto();
return_succes;
}

(pour la syntaxe c'est à peu près ça, j'ai l'habitude à l'autocompletion :-P )

Alors je sais pas faire du C++? ;-)

d'ailleurs j'en profite pour faire une annonce : je cherche un co developpeur pour mon moteur C++ SDL ;-)

Répondre à poussinphp

dsl j'ai oublié de préciser les types dans la class :-o

public: et private:

Enfin bon, je pense que ça t'aura convaincu (enfin j'espere :-P )

Pour l'initialisation à null je me suis trompé (avec les pointeur). Faut aps oublier que je suis pas sous un logiciel de dev aussi :-?

Répondre à poussinphp

Je voudrai juste réagir :

Citation :

Pour le malloc il n'est pas obligatoire, mais il est préférable d'apprendre correctement à programmer aux gens afin qu'ils prennent de bonne habitude depuis le début et qu'ils évitent de faire des choses qui marchent sans vraiment comprendre ce qui se passe, enfin c'est la philosophie que j'ai lorsque j'enseigne à mes étudiants



-> Pas tous les développeurs pensent comme, j'ai fait une petite recherche sur google, et j'y ai trouvé plusieurs, je peux te les passer si tu le souhaites

Répondre à tebonb

Bonsoir à tous,

pour le if je sui d'accord avec poussinphp mais
ca resoud pas le prbl qui est que tu compare une chaine
de caractère dans un if ce qui est interdit.
Ensuite je n'ai pa dit que tu ne savais pa faire du C++ mais
que tu disais que ton code était en C++ alors qu'il n'ya rien du concept de l'objet...


Pour tebonb, bien sur que tu trouveras des developpeurs qui ne sont pa rigoureux,
seulement moi on ma apris comme ca, j'enseigne comme ca et j'ai demandé à mes collègues
ils font exactement la meme chose dont certains connaissent le C depuis qu'il existe...

D'ailleurs j'organise un projet avec des étudiants de divers universités, est ce que ca te dirai
de participé bibop vu que tu ma l'air rigoureux. Il s'agit de developper un jeu en utilisant Direct3D
et FMOD ?

Bouh343

Répondre à celibataire

'Soir. Certaines universités disent aussi que ce n'est pas utile de caster un malloc. Ceci dit, chacun enseigne comme il le souhaite, je ne pense pas que ce sois question de rigoureux ou pas. Sur ce, je vais arrêter la discussion ici et je pense que tu es d'accord aussi pour dire que ce débat est interminable.
Bonne continuation à toi

Répondre à tebonb

bonsoir,

je sui d'accord avec toi. Si tu as d'autre problème C siverman, hésite pa à demander, ca anime le forum !!!
Surtout qu'en plus il ne sert meme pa de malloc, c un debat complet dans le vent.

Répondre à celibataire
Tom's Guide > Forum > Programmation > Problème en C
Aller à :

Il y a 273 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens