Probelme renvoi valeur

Résolu
sakjimh Messages postés 13 Date d'inscription jeudi 9 mars 2006 Statut Membre Dernière intervention 31 décembre 2007 - 21 oct. 2006 à 20:04
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 22 oct. 2006 à 19:03
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

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
22 oct. 2006 à 19:03
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++ (@++)<!--
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
21 oct. 2006 à 20:20
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++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
21 oct. 2006 à 20:28
Oups pardon. N'utilise pas scanf pour receuillir une chaine. scanf n'inclue pas les espaces. Utilise plutot gets.

C++ (@++)<!--
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
22 oct. 2006 à 04:47
Salut :

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

// Appel

int length;
char txt [256];

// ...

length = Saisie (txt);
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
22 oct. 2006 à 17:28
int Saisie (char *str)
{
    int n = 0;
    while ((str[n] = getchar()) != '\n')
        n++;

    str[n] = 0;
    return n;
}

C++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
22 oct. 2006 à 17:41
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++ (@++)<!--
0
sakjimh Messages postés 13 Date d'inscription jeudi 9 mars 2006 Statut Membre Dernière intervention 31 décembre 2007
22 oct. 2006 à 18:08
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
0
Rejoignez-nous