Saisie d'une chaîne de caractères ! [Résolu]

Ca.marchera - 29 janv. 2015 à 20:10 - Dernière réponse :  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;
}

Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
cptpingu 3789 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 25 mai 2018 Dernière intervention - 30 janv. 2015 à 14:06
1
Merci
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

Merci cptpingu 1

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de cptpingu
Ca.marchera - 30 janv. 2015 à 18:24
0
Merci
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
Commenter la réponse de Ca.marchera
cptpingu 3789 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 25 mai 2018 Dernière intervention - Modifié par cptpingu le 30/01/2015 à 18:57
0
Merci

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
Commenter la réponse de cptpingu
Ca.marchera - 30 janv. 2015 à 18:55
0
Merci
Merci beaucoup cptpingu
je vais essayer de terminer mon exercice
encore merci trop
Commenter la réponse de Ca.marchera

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.