|
Dernière réponse | |
---|---|
Sujet : [C] espace dans une chaine de caractere | |
gilou | Vi sauf que ce qu'ils disent pas chez HP, c'est que la lib pthreads est pas installée par defaur, ni les includes...
Bon, je pense qu'on peut arreter ce sujet, qui a devie a un point tel qu'on pourrait se croire sur BlaBla. A+, |
Aperçu |
---|
Vue Rapide de la discussion |
---|
gilou | Vi sauf que ce qu'ils disent pas chez HP, c'est que la lib pthreads est pas installée par defaur, ni les includes...
Bon, je pense qu'on peut arreter ce sujet, qui a devie a un point tel qu'on pourrait se croire sur BlaBla. A+, |
Jar Jar |
En farfouillant (pas longtemps) sur Google, voilà ce que j'ai trouvé :
Conclusion, il ne connaît pas _REENTRANT, mais si tu le définis tout marchera correctement partout (sauf probablement avec VC++, mais on s'en fout, car ce n'est pas un vrai compilateur C).
|
gilou |
|
Jar Jar |
Sisi, c'est standard. Ça marche au moins avec Sun CC et GCC.
|
gilou |
|
Jar Jar |
T'es sûr ? Même en compilant en -D_REENTRANT ? |
gilou |
|
Jar Jar |
Tu as mis sizeof(sujet) alors que c'est une chaîne allouée dynamiquement. Il faut plutôt déclarer une constante TOTO, faire un malloc(TOTO), et réutiliser TOTO dans le fgets. |
chaica | Bon c'est deja ca de corriger mais ca ne roule toujours pas.
hmm bon cherchons encore :D CHaiCA |
Jar Jar | Il faut vraiment éviter strcpy quand on ne sait pas ce qu'on fait (donc pour les newbies, c'est proscrit).
Avec ta routine, la valeur renvoyée est allouée avec malloc, donc pas besoin de la recopier ailleurs. Il vaut mieux mettre : sujet_fin=suj(); printf("%s",sujet_fin); free(sujet_fin); // À chaque malloc DOIT correspondre un free. |
HappyHarry | ben si tu alloues pas sujet_fin ... |
chaica | Bon me revoilà, voila où j'en suis
#include <stdio.h> #include <stdlib.h> #include <fonctions.h> char *suj() { char *sujet; sujet=malloc(1000); printf("Saisissez le sujet du mail:\n" ); fgets(sujet,sizeof(sujet),stdin); return sujet; } #include <stdio.h> #include <fonctions.h> int main() { char *sujet_fin; strcpy(sujet_fin,suj()); printf("%s",sujet_fin); return 0; (je ne copie que les bouts du programme concernant notre sujet) et bon maintenant j'ai un segmentation default. CHaiCA |
Jar Jar |
Bah en utilisant realloc, tu n'es pas sûr qu'il ne va pas bouger les données, alors qu'avec ton tampon tu es sûr qu'il va les bouger, donc le choix est vite fait... Et puis je ne voudrais pas avoir à développer sur l'unix que tu viens de citer, tu fais comment sans realloc pour faire des tableaux à taille variable ? |
gilou |
[jfdsdjhfuetppo]--Message édité par gilou--[/jfdsdjhfuetppo] |
Jar Jar | Primo, j'utilise un buffer statique, donc alloué a la compil, et si la fonction est utilisee n fois, j'ai pas besoin de faire plusieurs fois un malloc d'une taille inutile.
Non, il sera alloué sur le tas à chaque appel à ta fonction. Secondo, le strdup va faire un malloc, mais juste de la taille necessaire a contenir la chaîne, contrairement a ton cas. Oui, c'est pour ça que je suggère un :
[jfdsdjhfuetppo]--Message édité par Jar Jar--[/jfdsdjhfuetppo] |
gilou |
[jfdsdjhfuetppo]--Message édité par gilou--[/jfdsdjhfuetppo] |
Jar Jar |
Gni ? C'est string.h, sous Unix.
|
gilou | ==================================================
[jfdsdjhfuetppo]--Message édité par gilou--[/jfdsdjhfuetppo] |
Jar Jar | À la réflexion, tu ne peux pas renvoyer une chaîne allouée localement.
|
chaica | hmm j'ai essayé vos deux solutions et ca marche pas.
Eest ce qu'il y a quelque chose à faire autour de stdin, il faut le déclarer quelque part? CHaiCA |
[SDF]Poire | ou :
char *suj() { char sujet[1000]; printf("Saisissez le sujet:\n" ); fgets(sujet,1000 * sizeof(char),stdin); return sujet; } [jfdsdjhfuetppo]--Message édité par [SDF]Poire--[/jfdsdjhfuetppo] |
Jar Jar |
|
chaica | Bon je vais encore faire chier mais ca plante. Pourtant je n'ai rien lors de la compilation. j'affiche ma fonction
char *suj() { char sujet[1000]; printf("Saisissez le sujet:\n" ); fgets(sujet,sizeof(1000),stdin); return sujet; } hmm pas cool CHaiCA |
Jar Jar |
Oui, les pages de manuel de développement. Sous Debian, ça s'appelle manpages-dev (et manpages-fr pour la traduction). |
chaica | Jar Jar : j'ai une no manual entry pour fgets. Il me manquerait quelque chose?
CHaiCA |
antp |
[jfdsdjhfuetppo]--Message édité par antp--[/jfdsdjhfuetppo] |
torpe23 | t'es une putain de larve toi ! T'as 9 messages et t'arrive pas à faire ce que tu veux avec ça ! Si on te dis fgets, c'est que c'est fgets ! Et fgets, si tu te renseignais un peu sur cette fonction ( car l'aide de ton logiciel existe ! ), tu connaitrais ses arguments : char * fgets (char * s, int n, FILE * fic); Dans ton cas : fgets(chaine,nombre_de_caracteres,stdin); sinon c'est scanf("%[^\n]s",chaine), mais celui ci, je l'avais déja mis 3 messages plus haut !... |
Jar Jar | Chaica, tu connais la commande man ?
man fgets
[jfdsdjhfuetppo]--Message édité par Jar Jar--[/jfdsdjhfuetppo] |
antp | fgets(ma_chaine, sizeof(ma_chaine), stdin);
Et je confirme que fgets c'est la meilleure solution "C standard" pour lire des chaînes. Le sizeof(ma_chaine) empêche un dépassement de buffer, chose que gets ne fait pas il me semble. [jfdsdjhfuetppo]--Message édité par antp--[/jfdsdjhfuetppo] |
chaica | J'entre fgets(machaine) et ca marche pas. fgets ca ne doit pas lire une fichiner moi je veux l'équivalent d'un scanf("%s",machaine) mais qui puisse aussi stocker les espaces. CHaiCA [jfdsdjhfuetppo]--Message édité par chaica--[/jfdsdjhfuetppo] |
Jar Jar | fgets |
chaica | Je me permets de reposer ma question parce qu'il semble qu'on se soit égaré :
Quelle commande utiliser pour saisir une chaine de caractere avec les espaces (je veux en fait que l'utilisateur du programme entre une phrase.) ? CHaiCA |
cycojesus |
|
El_gringo |
|
torpe23 | il y a aussi scanf("%[^\n]s",...) pour prendre tous les caractères sauf le retour chariot. Ne pas oublier le fflush(stdin) pour vider le tampon afin qu'il n'y ait pas d'erreurs ! |
[SDF]Poire |
|
Jar Jar |
JAMAIS !!!!!
|
[SDF]Poire |
|
chaica | Lors d'une saisie d'une chaine de caractere, les espaces font interrompre la saisie au premier mot qui precede l'espace. Comment peut on faire pour que la chaine soit enregistre entierement AVEC les espaces?
CHaiCA |