Remplacer espace en retour à la ligne C
Fermé
ahemd
-
10 févr. 2011 à 21:34
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 12 févr. 2011 à 00:06
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 12 févr. 2011 à 00:06
A voir également:
- Remplacer espace en retour à la ligne C
- Espace insécable word - Guide
- Aller à la ligne excel - Guide
- Partager photos en ligne - Guide
- Site de vente en ligne particulier - Guide
- Remplacer disque dur par ssd - Guide
3 réponses
crazycode
Messages postés
35
Date d'inscription
jeudi 20 janvier 2011
Statut
Membre
Dernière intervention
10 février 2011
2
10 févr. 2011 à 21:55
10 févr. 2011 à 21:55
déja tu ne cherches pas espace mais fin de chaine
position=strchr(chaine,'\0');
à remplacer par
position=strchr(chaine,' ');
après l'algo je n'est pas vérifié
position=strchr(chaine,'\0');
à remplacer par
position=strchr(chaine,' ');
après l'algo je n'est pas vérifié
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
10 févr. 2011 à 22:21
10 févr. 2011 à 22:21
J'ai pas tout lu, mais ya pas mal de fautes.
Tu mets dans le prototype de ta fonction sauvegarder :
char *chaine[]
Alors que chaine est définie en : char chaine[100];
fgets(nomfichier, 50,stdin);
fichier = fopen(nomfichier,"w");
Attention, fgets te stockera le retour chariot '\n' à la fin de la chaîne s'il a la place. Donc ton nom de fichier sera bizarre. Il faut donc remplacer le '\n' par '\0' (tu peux t'aider de strchr).
position=strchr(chaine,'\0');
Si tu fais ça, tu vas rechercher le caractère terminal. Cela renverra NULL;
Toi ce que tu souhaites, c'est rechercher les espaces dont le code ascii est ' '. Après, à toi de voir si tu veux tous les remplacer ou pas. Dans ce cas, il faudra réaliser une boucle while.
Tu mets dans le prototype de ta fonction sauvegarder :
char *chaine[]
Alors que chaine est définie en : char chaine[100];
fgets(nomfichier, 50,stdin);
fichier = fopen(nomfichier,"w");
Attention, fgets te stockera le retour chariot '\n' à la fin de la chaîne s'il a la place. Donc ton nom de fichier sera bizarre. Il faut donc remplacer le '\n' par '\0' (tu peux t'aider de strchr).
position=strchr(chaine,'\0');
Si tu fais ça, tu vas rechercher le caractère terminal. Cela renverra NULL;
Toi ce que tu souhaites, c'est rechercher les espaces dont le code ascii est ' '. Après, à toi de voir si tu veux tous les remplacer ou pas. Dans ce cas, il faudra réaliser une boucle while.
Groarh
Messages postés
682
Date d'inscription
vendredi 1 août 2008
Statut
Membre
Dernière intervention
28 juin 2015
185
10 févr. 2011 à 23:03
10 févr. 2011 à 23:03
Salut,
tu as vérifié tes warnings de compilation ? Avec gcc, j'ai ça :
Pour les 3 premiers, il suffit de retirer soit [] soit * à ton paramètre chaine. Pour le return, je pense que c'est une inattention de ta part, sa place est bien sûr dans le main. Le dernier part une fois que tu as corrigé le paramètre chaine.
Perso j'ai eu un problème avec tes fgets qui utilisent stdin, il y avait un saut de ligne qui s'incrustait. Un dump de ce genre :
m'affichait des trucs comme :
Tu vois le genre. Je te conseille d'utiliser simplement gets, au moins pour le nom de fichier.
Au niveau de ton second fopen, je ne comprends pas du tout ce que tu cherches à faire :/ On dirait que tu oublies d'inscrire des choses dans le fichier... Tu récupères juste une chaîne depuis stdin, tu la modifies mais tu n'en fais rien ensuite.
En fait j'ai juste l'impression que tu as codé trop vite, ou alors que tu étais fatigué ^^
tu as vérifié tes warnings de compilation ? Avec gcc, j'ai ça :
.\newline.c: In function 'sauvegarde': .\newline.c:15: warning: passing arg 1 of 'fgets' from incompatible pointer type .\newline.c:22: warning: passing arg 1 of 'fgets' from incompatible pointer type .\newline.c:24: warning: passing arg 1 of 'strchr' from incompatible pointe r type .\newline.c:29: warning: 'return' with a value, in function returning void .\newline.c: In function 'main': .\newline.c:37: warning: passing arg 1 of 'sauvegarde' from incompatible po inter type
Pour les 3 premiers, il suffit de retirer soit [] soit * à ton paramètre chaine. Pour le return, je pense que c'est une inattention de ta part, sa place est bien sûr dans le main. Le dernier part une fois que tu as corrigé le paramètre chaine.
Perso j'ai eu un problème avec tes fgets qui utilisent stdin, il y avait un saut de ligne qui s'incrustait. Un dump de ce genre :
printf("[%s]\n", nomfichier);
m'affichait des trucs comme :
[test ]
Tu vois le genre. Je te conseille d'utiliser simplement gets, au moins pour le nom de fichier.
Au niveau de ton second fopen, je ne comprends pas du tout ce que tu cherches à faire :/ On dirait que tu oublies d'inscrire des choses dans le fichier... Tu récupères juste une chaîne depuis stdin, tu la modifies mais tu n'en fais rien ensuite.
En fait j'ai juste l'impression que tu as codé trop vite, ou alors que tu étais fatigué ^^
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
10 févr. 2011 à 23:07
10 févr. 2011 à 23:07
Tu vois le genre. Je te conseille d'utiliser simplement gets, au moins pour le nom de fichier.
Mauvais conseil ^^. Non seulement, tu n'indiques pas la taille (fonction à éviter) et en plus le '\n' vient également se stocker. Lorsqu'on utilise fgets, il suffit de remplacer le '\n' au moyen de strchr. Ou alors, on peut utiliser scanf("%49s",nomfichier); comme ça pas besoin de retirer le '\n'.
Cdlt,
Mauvais conseil ^^. Non seulement, tu n'indiques pas la taille (fonction à éviter) et en plus le '\n' vient également se stocker. Lorsqu'on utilise fgets, il suffit de remplacer le '\n' au moyen de strchr. Ou alors, on peut utiliser scanf("%49s",nomfichier); comme ça pas besoin de retirer le '\n'.
Cdlt,
Groarh
Messages postés
682
Date d'inscription
vendredi 1 août 2008
Statut
Membre
Dernière intervention
28 juin 2015
185
11 févr. 2011 à 00:13
11 févr. 2011 à 00:13
Bien vu le scanf, par contre je pense qu'il n'y a pas besoin de faire -1 sur la taille.
Ok, alors un truc comme ça pour que ça soit dynamique :
Pfiou... ^^
Ok, alors un truc comme ça pour que ça soit dynamique :
char format[6]; strcpy(format, "%"); char temp[4]; strcat(format, itoa(taille, temp, 10)); strcat(format, "s"); scanf(format, nomfichier);
Pfiou... ^^
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
11 févr. 2011 à 23:20
11 févr. 2011 à 23:20
Bien vu le scanf, par contre je pense qu'il n'y a pas besoin de faire -1 sur la taille.
Si, il y en a besoin.
Pfiou... ^^
Ou plus simplement : sprintf(format,"%%%ds",taille-1);
Cdlt,
Si, il y en a besoin.
Pfiou... ^^
Ou plus simplement : sprintf(format,"%%%ds",taille-1);
Cdlt,
Groarh
Messages postés
682
Date d'inscription
vendredi 1 août 2008
Statut
Membre
Dernière intervention
28 juin 2015
185
11 févr. 2011 à 23:44
11 févr. 2011 à 23:44
Tu peux expliquer du coup l'histoire du -1 ? Parce que j'ai mis 50 et j'ai quand même pas de saut de ligne, du coup je vois pas ^^
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
Modifié par fiddy le 12/02/2011 à 00:07
Modifié par fiddy le 12/02/2011 à 00:07
arce que j'ai mis 50 et j'ai quand même pas de saut de ligne
Normal, le format "%s" ne prend pas le retour chariot.
Tu peux expliquer du coup l'histoire du -1 ?
Lorsque tu mets "%5s", scanf va lire 5 caractères et mettre le caractère terminal juste après. Ce qui fera 6 caractères au total, et donc un petit stack overflow (ou heap overflow s'il s'agit d'un pointeur).
Normal, le format "%s" ne prend pas le retour chariot.
Tu peux expliquer du coup l'histoire du -1 ?
Lorsque tu mets "%5s", scanf va lire 5 caractères et mettre le caractère terminal juste après. Ce qui fera 6 caractères au total, et donc un petit stack overflow (ou heap overflow s'il s'agit d'un pointeur).