Saisie d'une chaîne de caractères !

Résolu
Ca.marchera - Modifié par Ca.marchera le 29/01/2015 à 20:11
 Ca.marchera - 30 janv. 2015 à 18:55
Bonsoir,
SVP je ne sais pas ou est le problème ici
l exécution est vide
c'est la premiere partie de l'exércice :(


#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void Re_Saisie()
{   char bin[50] ;
    printf("donnez un nombre binaire \n");
    fgets(bin,50,stdin);
    printf("votre binaire est %s",bin);
}
int Verif()
{ int i;
  char bin[50] ;
    for(i=0;i<strlen(bin);i++)
        if((bin[i]!=1)&&(bin[i]!=0))
    {
        Re_Saisie(bin);
    }
    return bin;
}

 int main()
{  int i;
   char bin[50] ;
   void Re_Saisie();
   int Verif();

      return 0;
}

4 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 124
30 janv. 2015 à 14:06
Bonjour.

Tout d'abord, il faut bien différencier déclaration de fonctions et utilisation de fonctions. Dans ton main, tu "décris" des fonctions, mais tu ne les utilise pas.
Ensuite, il faut comprendre le "scope" (ou portée) des variables. Une variable est locale à une fonction. C'est à dire qu'elle n'est vue que dans la fonction où elle est déclarée. Pour que différentes fonctions puissent "voir" les variables et donc communiquer, il faut passer celles-ci en argument.
Enfin, il faut la "vérification" dans la fonction de saisie, et non l'inverse. C'est bien pendant ta saisie que tu vérifies. Tu ne saisies rien pendant que tu vérifies !
Enfin, il faut comparer non pas 1 et 0 mais le caractère '1' et le caractère '0'. En effet, si tu récupères une chaine de caractères, alors tu dois la comparer comme telle. Exemple: "toto" équivaut à: {'t', 'o', 't', 'o'}. La chaîne "1011" équivaut à {'1', '0', '1', '1'}.

'1' vaut en fait 31, '2' vaut 32, 't' vaut 74 etc..
Regarde ce qu'est la table "ASCII" pour bien comprendre: https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/ASCII-Table-wide.svg/800px-ASCII-Table-wide.svg.png

Réécriture au propre:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int verif(char bin[50])
{
  int i = 0;
  int size = 0;

  size = strlen(bin);
  for (i = 0; i < size;i++)
    if (bin[i] != '1' && bin[i] != '0')
      return 0;

  return 1;
}

void saisie(char bin[50])
{
  int valid = 0;

  while (!valid)
  {
    printf("Donnez un nombre binaire: ");
    scanf("%50s", bin);
    if (!verif(bin))
      printf("Nombre invalid: %s\n", bin);
    else
      valid = 1;
  }
}

int main()
{
  char bin[50] = {0};

  saisie(bin);
  printf("Votre binaire est %s\n", bin);

  return 0;
}


__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
1
Bonsoir ,
Merci Cher cptpingu de me répondre
mais j ai quelque questions si ça ne dérange pas,

1- pourqoui dans le main vous n'avez pas déclaré la fonction "vérif"

2- pourqoui vous avez mis :
size = strlen(bin);
for (i = 0; i < size;i++)
au liey de : for (i = 0; i < strlen(bin) ;i++)

3-pourquoi scanf("%50s", bin) au lieu de scanf ("%s", bin)

4- la fonction vérif manque les accolades de la boule for je crois , et est ce que entre le "return 0" et le "return 1" il manque un "else" ? ou non ?

Merci d'avance
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 124
Modifié par cptpingu le 30/01/2015 à 18:57

1- pourqoui dans le main vous n'avez pas déclaré la fonction "vérif"


La fonction "existe" et est vu par le main, vu qu'elle est au-dessus d'elle. Si la fonction était en dessous, elle ne serait pas vu. Je l'aurais alors déclarée. Mais une déclaration ne se fait jamais dans une fonction, mais en haut d'un fichier. Exemple:
// coucou est au dessus de main. Donc main la voit.
void coucou()
{
}

int main()
{
   coucou();
}

ou
void coucou(); // On dit: attention, la fonction coucou, tu ne la vois pas, mais je te garantis qu'elle existe ailleurs.

int main()
{
   coucou();
}

// Coucou est en dessous de main. Donc main ne la voit pas.
void coucou()
{
}




2- pourqoui vous avez mis :
size = strlen(bin);
for (i = 0; i < size;i++)
au liey de : for (i = 0; i < strlen(bin) ;i++)

Si tu met ton strlen dans la boucle for, alors à *chaque tour* de boucle, tu relances la fonction strlen. Donc tu re-calcule la taille de ta chaîne tout le temps, ce qui est très mauvais pour les performances (surtout pour que la taille ne change pas, c'est du gachis !). Dans mon cas, je ne calcule qu'une seule fois la taille, que je stocke.


3-pourquoi scanf("%50s", bin) au lieu de scanf ("%s", bin)

%s veut dire: une chaîne de caractère de n'importe quelle taille.
%50s veut dire: une chaîne de caractère au maximum de 50 caractères.


4- la fonction vérif manque les accolades de la boule for je crois


Il n'y a pas besoin d'accolades si il n'y a qu'une seule instruction. Il n'y a pas d'erreur.
ceci:
  for (i = 0; i < size;i++)
    if (bin[i] != '1' && bin[i] != '0')
      return 0;

  return 1;


est absolument équivalent à cela:
  for (i = 0; i < size;i++)
  {
    if (bin[i] != '1' && bin[i] != '0')
    {
      return 0;
     }
   }

  return 1;



et est ce que entre le "return 0" et le "return 1" il manque un "else" ? ou non ?

Il ne manque pas de else. Si tu mets un else, alors ta fonction ne fera que dire si le premier caractère est correcte ou non.
Je t'invite à bien relire l'algo pour le comprendre.

__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
Merci beaucoup cptpingu
je vais essayer de terminer mon exercice
encore merci trop
0