Se connecter avec
S'enregistrer | Connectez-vous

Problème en C

Dernière réponse : dans Programmation

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++ )

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


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

Exemple :

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


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

Autres pages sur : probleme

Lassé par la pub ? Créez un compte
Expert Programmation

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.

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 
Expert Programmation

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.

Bonjour

Citation :
if (szPrenom == 'sliverman')

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

Ensuite, tu peux faire

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

sans oublier d'inclure "malloc.h"

Bibop

  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

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

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.

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

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

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

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

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

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;
}

;-)

bonjour à tous,

poussinphp, peut tu nous rappelé l'utilité de
  1. using namespaces std;
s'il te plait?
ensuite tu initialise une chaine a null ??!!!
  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

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 ;-)

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 :-?

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

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

'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
Lassé par la pub ? Créez un compte
Tom's guide dans le monde