Probelme renvoi valeur [Résolu]

Signaler
Messages postés
13
Date d'inscription
jeudi 9 mars 2006
Statut
Membre
Dernière intervention
31 décembre 2007
-
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
salut
cette procedure est censée enregistrer un tableau et une valeur du compteur i:
void saisie(char x[L],int i)
{
   for(i=0;x[i-1]!='\n';i++)
   scanf("%c",&x[i]);
   x[i]='\0';
}
mais quand je lance le programme il me donne une autre valeur pourquoi?

7 réponses

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Non non. Les dernières fonctions que je t'ai montré sont mieux. Elle permette d'utiliser ta fonction sur des chaines de taille variable (pas seulement de taille L) et évite les débordements tampon. Elle n'est pas plus compliqué à utiliser:

char chaine[L];
Saisie(chaine, L);

C'est tout.

Enfin, c'est ce que moi je te recommande.

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Je ne comprend pas trop mais d'après ce que je comprend, tu veux ravoir le nombre de caractère écrit c'est bien ça? Dans ce cas, suffis de le renvoyer.

int saisie(char *x)
{
   int i;
   for(i=0;x[i-1]!='\n';i++)
   scanf("%c",&x[i]);
   x[i]='\0';

   return i;
}

Je ne comprend pas bien le fonctionnement de ta fonction. Si tu veux une chaine de caractères, completement inutile de faire une fonction personnelle et d'appeller 40 fois scanf. Une fois suffit:

scanf("%s", buffer);
et si la taille est nécessaire, strlen fera l'affaire.

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Oups pardon. N'utilise pas scanf pour receuillir une chaine. scanf n'inclue pas les espaces. Utilise plutot gets.

C++ (@++)<!--
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut :

int Saisie (char str []) {
    int n = 0;
    while ((str [n++] = getchar ()) != '\n')
          ;
    return n;
}

// Appel

int length;
char txt [256];

// ...

length = Saisie (txt);
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
int Saisie (char *str)
{
    int n = 0;
    while ((str[n] = getchar()) != '\n')
        n++;

    str[n] = 0;
    return n;
}

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Et puis d'ailleur, on ferait peut-être mieu d'ajouter une protection pour ne pas créé de bufer overflow.
Tu as deux choix: Tu peux faire la fonction de sorte que si tu dépasse le nombre de caractère, on coupe à la limite donc si tu tape "Bonjour" mais que le max est trois, ça donne "Bon":
int Saisie (char *str, int maxlen)
{
    int n = 0;

    while ((str [n] = getchar ()) != '\n')
    {
        if(n >= maxlen)
            break;

        n++;
    }

    str[n] = 0;
    return n;
}

ou tu quitte tout simplement sans rien envoyer:
int Saisie (char *str, int maxlen)
{
    int n = 0;

    while ((str [n] = getchar ()) != '\n')
    {
        if(n >= maxlen)
        {
            n = 0;
            goto endFUNC;
        }

        n++;
    }

endFUNC:
    str[n] = 0;
    return n;
}

Pour ma part, je n'aurais pas procédé comme ça mais si c'est ce que tu veux...

C++ (@++)<!--
Messages postés
13
Date d'inscription
jeudi 9 mars 2006
Statut
Membre
Dernière intervention
31 décembre 2007

non non pas ça!!
j'ai compris le compilateur a confondu le i (compteur) avec la taille initiale L c'est vrais en algorithmique c'est pas comme en programmation surtout avec le C je suis habitué sur le pascal qui trés proche de l'algo il faut s'habitué
bon resoudre le probeme:
int saisie(char x[L])
{
   int i; 
   for(i=0;x[i-1]!='\n';i++)
   scanf("%c",&x[i]);
   x[i]='\0';
      return(i);
}
puis a l'appele s=(saisie(ch))il est obliger de saisir et renvoier la taille de la chaîne en meme temps
bon merci et desolé pour le dérongement