Fonction scanf help !

Résolu/Fermé
toinou293 Messages postés 33 Date d'inscription dimanche 25 décembre 2011 Statut Membre Dernière intervention 17 septembre 2013 - 1 déc. 2012 à 10:24
toinou293 Messages postés 33 Date d'inscription dimanche 25 décembre 2011 Statut Membre Dernière intervention 17 septembre 2013 - 2 déc. 2012 à 00:58
Bonjour,

j'aimerai savoir comment mettre une chaine de caractère en argument pour la fonction scanf. par exemple :
int     main(int ac, char **av)
{
  char *str;

  printf("mettez votre commande\n");
  while(42)
    {
      scanf("%s", &str);
      if (str == "play")
        {
          printf("BoOm BoOm TchaK\n");
          break;
        }
    }
}


j'aimerai que quand j'ecris play ca m'écrive "boom boom tchak"
merci d'avance

1 réponse

dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
1 déc. 2012 à 15:41
hello
essayer
#include <string.h>
#include <stdio.h>

int     main(int ac, char **av)
{
  char str[128];

  printf("mettez votre commande\n");
  while(42)
    {
      scanf("%s", str);
      if (strcmp(str, "play") == 0)
        {
          printf("BoOm BoOm TchaK\n");
          break;
        }
    }
}
1
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 860
Modifié par bizu53 le 1/12/2012 à 16:48
Répondre sans donner d'explication n'est pas constructif, alors j'ajoute à ton code les raisons de modification (en m'adressant à toinou293).

Concernant
scanf("%s", &str);
tu lui donnes un pointeur sur ton pointeur str. Il faut donc
scanf("%s", str);

Ensuite, ton pointeur str n'est qu'un pointeur qui ne pointe nulle part (quelque part plus ou moins aléatoire si je me souviens bien) car tu n'a pas alloué de mémoire "en face".
Donc soit tu fixes une taille comme l'a fait dubcek
char str[128];
soit tu alloues de la mémoire "en face" de ton pointeur avec
str = malloc(128 * sizeof(char));
(à faire suivre d'un
free(str);
quand tu n'en a plus besoin pour libérer la mémoire allouée).

Concernant la comparaison
str == "play"
, je ne sais pas si ça compile (j'écris sans tester) mais même si c'était le cas ça serait toujours faux. Dis-toi que les (vraies) chaînes de caractères n'existent pas en C, ce ne sont que des caractères à la suite (abusivement appelées "chaîne de caractères" quand même), dont tu as un pointeur sur le premier : str est un pointeur, donc faire "str == [...]" signifie "est-ce que mon pointeur str est équivalent à [...] ?". Pour savoir si tous les caractères sont 1 à 1 égaux, tu as la fonction strcmp qui existe qui retourne 0 s'il n'y a pas de différence entre les deux.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
1 déc. 2012 à 18:21
str == "play"
Je ne vois pas pourquoi ça compilerait pas... On a bien le droit de faire des comparaisons d'adresses mémoires...
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 860
Modifié par bizu53 le 1/12/2012 à 21:19
Je n'ai pas affirmé que ça ne compilait pas, j'ai clairement émis un doute d'ailleurs.
Je pense qu'avec les options que warning ça doit quand même pouvoir être signalé (et dans ce cas, mais je triche, pour peu qu'on active l'option considérant les warnings comme des erreurs ... :-)).
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
1 déc. 2012 à 22:36
Oui effectivement, je confirme qu'il y a bien un warning. Et c'est normal, cette comparaison provoque un comportement indéterminé.
0
toinou293 Messages postés 33 Date d'inscription dimanche 25 décembre 2011 Statut Membre Dernière intervention 17 septembre 2013 1
2 déc. 2012 à 00:58
Super merci beaucoup les gens, merci dubcek tu m'as bcp aidé ! tchuss :)
0