Probleme fonction en c

Résolu/Fermé
mathlo - 6 mars 2012 à 21:16
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 6 mars 2012 à 23:47
Bonjour,
voila ma fonction bug,grace a des tests de printfs, je sais que c'est au moment de
Actu = chaine[compteur]; le 2eme...

bref voila le code, merci d'avance!



#include <stdio.h>
#include <stdlib.h>
int str_lg (int* chaine[], int compteur, char Actu);

char chaine[]="";
char Actu='NULL';
int compteur = 0; ref=0;
int i =0;


int main()
{
    printf("Entrez une chaine de mot\n");
    scanf("%s", chaine);
    i = str_lg (&chaine[compteur], compteur, Actu);
    printf("longueur = %d", i);

    return 0;
}


int str_lg (int* chaine[], int compteur, char Actu)
{
    while(ref==0)
    {
    Actu = chaine[compteur];
    printf("%c", Actu);
    while(Actu !='\0')
    {
        compteur++;
        printf("%d", compteur);
        Actu = chaine[compteur];
        printf("%c", Actu);
    }
    ref++;
    }
    compteur--;
    return compteur;
}



9 réponses

Utilisateur anonyme
6 mars 2012 à 21:20
Qu'as-tu essayé de faire ? Quel est le pc de ce chp ?
0
je veux recréer par moi meme la fonction strlen;
pour ca je fais une boucle avec un compteur jusqua ce que le caractere soit "\0(celui de fin) et je renvoie la valeur...
mais ca bugge la ou jai dit dans le premier post :s
0
Utilisateur anonyme
6 mars 2012 à 21:27
Désolé je ne suis aps assez qualifié là :S
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
Modifié par fiddy le 6/03/2012 à 21:36
Bonjour,
char chaine[]="";
Cela revient à faire : char chaine[1]; chaine[0]='\0';
Autrement dit votre tableau ne contient qu'une case.
Ensuite, évite d'utiliser des variables globales. C'est une très mauvaise habitude.
Je te laisse corriger ces points-là. Reposte le code avec ces corrections si ça ne marche toujours pas.

Google is your friend
0

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

Posez votre question
Bon, jai reussi sans le metre dans la fonction juste dans le main...

char chaine[]=""; char lettre = 0;
int compteur = 0; ref=0;
int i =0;


int main()
{
printf("Entrez une chaine de mot\n");
scanf("%s", chaine);
lettre=chaine[0];
while(lettre!='\0')
{
compteur++;
lettre = chaine[compteur];
}
printf("longueur = %d", compteur);

return 0;
}


mais j'aimerai vraiment créer la fonction... probleme de pointeur?
si quelqu'un pouvait m'aider...
0
hi fiddy !
merci ok je m'y je vais tout recommencer je pense merci du conseil !

ps : au moment ou tu répondais, je regardais ton site, t'as l'air d'etre baleze :p c'est ton métier?
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
6 mars 2012 à 21:52
char chaine[]="";

...

scanf("%s", chaine);




il faut faire très attention, en C, avec les chaines de caractères.

ce sont donc des tableaux de caractères, terminés par le caractère '\0' (le caractere NULL)

ils ont une taille fixe.

lorsque tu crées ton tableau au départ, tu ne précises pas de taille entre les crochets.

Le compilateur va donc devoir trouver une taille tout seul, car il faut préciser une taille pour les tableaux en C.

Comme la chaines est une chaine vide ( char chaine[]="";)

le tableau sera mis à ... une taille de 1 caractère ! (juste une place pour le '\0' )

ensuite, lorsque tu voudras faire :


scanf("%s", chaine);


tu vas probablement écrire plus que 0 caractère donc....

tu va écrire après ton tableau !

Apparemment, par *chance* ça ne cause pas d'erreur tout de suite.

mais c'est bien là la principale source de problème qui arrivent après.

lorsque tu veux lire ce que tu as écris, il y a des erreurs car tu essayes de lire une zone mémoire qui n'est pas correctement allouée à ton programme, et donc divers problèmes bizarres arrivent.


li te faut déclarer ta chaine avec de l'espace dedans, pour pouvoir stoquer ce que tu écriras comme :

char chaine[200]="";


après il y a peut etre d'autres erreurs, j'ai pas tout lu.
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
6 mars 2012 à 21:53
arf, j'ai écrit puis envoyé plus tard, je suis un peu à la ramasse après toutes les réponses xD
0
merci attente je rebosse dessus mais ca marche pas 30 sec
0
Voila mon *nouveau* code un peu plus *propre* j'espere...


#include <stdio.h>
#include <stdlib.h>
int longueur (int* chaine[]);

char chaine[100];

int main()
{
int tot = 0;
printf("Entrez un mot :\n");
scanf("%s", chaine);
tot = longueur(&chaine);
printf("nbre caractere = %d", tot);
}

int longueur (int* chaine[])
{
char lettre = 0; int i = 0;
lettre = chaine[i];
while (lettre != '\n')
{
i++;
lettre = chaine[i];
printf("%d\n",lettre);
}
return i;
}

MAis ca me*de toujours dans ma boucle..
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
6 mars 2012 à 22:12
Et la fonction chaine ? Allez hop dans le main aussi, aucune variable globale.

tot = longueur(&chaine);
Il ne faut pas mettre l'esperluette : tot=longueur(chaine);

int longueur (int* chaine[])
chaine est de type char*, donc : int longueur(char chaine[])

while (lettre != '\n')
Dans chaine, il n'y aura pas de '\n' (puisque tu as utilisé scanf qui ne le stocke pas). Il suffit que t'ailles jusqu'au '\0'. Donc while(lettre != '\0')

Et enfin dans ton mail, tu as oublié le return 0;

Tiens-nous au courant.
0
bref, tu es un ouf :p

voila mon code...

#include <stdio.h>
#include <stdlib.h>
int longueur (char chaine[]);

int main()
{
int tot = 0; char chaine[100];
printf("Entrez un mot :\n");
scanf("%s", chaine);
tot = longueur(chaine);
printf("nbre caractere = %d", tot);
return 0;
}

int longueur (char chaine[])
{
char lettre = 0; int i = 0;
lettre = chaine[i];
while (lettre != '\0')
{
lettre = chaine[i];
i++;
}
i--;
return i;
}

merci beaucoup, tu n'as pas repondu a ma question d'avant, c'est ton métier, ou tu fais ca par "passion"?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
Modifié par fiddy le 6/03/2012 à 22:43
Beh, ton code doit marcher là non ? Après, il ne faut pas que tu mettes d'espace dans ta chaîne de caractère car ton scanf ne prendra que le premier mot.

Sinon pour répondre à ta question, rien à voir avec mon métier...
0
la ca marche en effet ;)

ok...


alors autre probleme si tu peux m'aider :p
j'attaque la fonction strcpy maintenant donc voila MA fonction



void str_copie (char chaine[], char copie[])
{
int longueur = str_long(chaine);
int i = 0;
while (i<longueur)
{
copie[i]=chaine[i];
i++;
}
printf("modele = %s\n", chaine);
printf("copie = %s\n", copie);
}


qui marche... MAIS juste apres le printf de copie il maffiche 3 caractere bizzarres, comme un ? inversé... idée?
0
jai trouvé tout seul en fait merci quand meme
(il faut mettre longueur + 1 pour qu'il copie aussi le \n)... ;)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
6 mars 2012 à 22:38
Est-ce que copie a été initialisé comme : char copie[200] (comme tu as fait pour char chaine[200]) ?
Sinon, tu as oublié de mettre copie[i]='\0'; juste avant le printf("modele=...");
Le '\0' doit terminer la chaîne.
0
merci encore
0