question con mais bon.... chaine de caracteres. [c] - Programmation
Marsh Posté le 11-05-2001 à 11:42:57
char buffer[100];
int i=0;
do
{
c= getc();
buffer[i++]=c;
}
while (c != '\n');
buffer[i]=0;
printf("%s",buffer);
ou qq chose comme ca, je suis pas sur pour le getc()
A moins qu'il y ait un %l pour line avec scanf...
Marsh Posté le 11-05-2001 à 11:46:56
la chui sur dev-c++... ze debute en codant de a a z pour apprendre, voila...
tgrx, je comprend ta fonction, mais dois-je en deduire que le C tout con ne gere pas tout seul le probleme avec un parametre ? faut tout lui expliquer a la mano ?
Marsh Posté le 11-05-2001 à 11:47:44
Bah non, c'est pas une question con !
Et y a qu'avec des questions, même si elles semblent anodines, qu'on peut progresser
J'apporte ma réponse "conne" (pour ceux qui le pensent, pff)
1) ajoute la libraire string.h au début de ton code
2) tu déclare un tableau de n caractères (la longueur dépend de la longueur de ta chaîne + 1)
3) tu fais un fgets (plus fiable que gets)
je te montre par l'exemple :
#include <stdio.h>
#include <string.h>
main()
{
char phrase[51] /* 50 longueur maxi, prévoir pour \0 */
int i;
printf ("Phrase : " );
fgets (phrase, 50, stdin);
for (i = 0; i < strlen(phrase); ++i)
printf ("%c", phrase[i]);
printf ("\n" );
return;
}
[edit]--Message édité par Aricoh--[/edit]
Marsh Posté le 11-05-2001 à 11:55:50
Merci bcp msieur !!
sinon t'as oublier un ; apres le char phrase[51] (oui oui j'fais le malin )
merci encore Aricoh et les autres
Marsh Posté le 11-05-2001 à 12:15:26
paranoid_android a écrit a écrit : sinon t'as oublier un ; apres le char phrase[51] |
c'était pour voir si tu suivais
Marsh Posté le 11-05-2001 à 13:50:57
Il y a une petite erreur
fgets (phrase, 51, stdin);
et pas 50, qui lira seulement 49 caractères.
Il n'est pas nécessaire de toucher à la déclaration.
char Phrase[51]; est correct et on ne perd pas un octet.
Vala
Marsh Posté le 11-05-2001 à 14:33:08
Vi vi, c'était fait exprès
et notre camarade, ben il l'a pas vu ...
Arf, moi non plus d'ailleurs !
en fait, à chque fois je me pose tjs la question : dans le fgets, il est pris en compte ou pas, le '\0' ?
Bon ben là, apparemment voui mais j'suis sur que demain, j'aurais oublié
Marsh Posté le 11-05-2001 à 15:21:47
C vrai que c un peu relou leur histoire de \O ...
y'a strlen() qui l'enleve dans le total a ce que g vue... bref on fait ce qu'on veut mais 'tin pour faire une pauvre phrase y'a 3000 methodes, 12000 fonctions, et ca comptes jamais pareil !
Sinon voila je continue... par contre dev-c++ le compilo il est fou il me place des erreurs qui sont en fait 12 lignes au dessus ! c'k'on s'marre !
Marsh Posté le 11-05-2001 à 15:30:09
Y a d'autres solution.Parceque si ta phrase est plus longue que 50 caracteres ton char buffers[51], ben, il va se planter.
Si tu veux utiliser un tableau pour ranger ta phrase tu peux faire un:
char buffers[];
puis tu remplace ton scanf() par un gets() car un gets() lit tout ce qui est tapé jusqu'a un appuie sur la touche Entree(donc il prends les espaces.
Marsh Posté le 11-05-2001 à 16:01:51
Arf...decidement c'est pas mon jour(qui a dit que c'etait jamais mon jour ?) j'avais mal lu.
Marsh Posté le 11-05-2001 à 16:02:55
kill9 a écrit a écrit : Arf...decidement c'est pas mon jour(qui a dit que c'etait jamais mon jour ?) j'avais mal lu. |
Il commençait à me faire douter en +
Marsh Posté le 12-05-2001 à 08:27:40
kill9 a écrit a écrit : n'empeche, c'est quand meme mieux avec char buffers[]; |
Non: puisque tu n'a pas alloue la taille du buffer, ca va pas aller loin ton code.
De plus gets s est une fonction qui merde des que tu essayes d'ecrire plus que la taille de la zone dans laquelle tu veux ecrire. fgets est nettement plus blindee.
Un truc dans le style:
#define BUFSIZE 1024
int i=1;
char *p, *buffer;
buffer = malloc((BUFSIZE+1)*sizeof(char));
p=buffer;
while (fgets(buffer, BUFSIZE+1, stdin) && !feof(stdin))
{
p=realloc(p, ((i+1)*BUFSIZE)+1);
buffer = p+i*BUFSIZE;
i++;
}
J'ai tape ca a vue de nez et je garantis pas le test d'arret du while (lire la doc (man fgets) pour verifier).
L'idee: tu lis par tranche de BUFSIZE caracteres, et tu realloues une tranche tant que c'est necessaire.
A+,
[edit]--Message édité par gilou--[/edit]
Marsh Posté le 14-05-2001 à 11:17:53
Euh...
Je vais me faire conspuer...
p=realloc (p,((i+1)*(BUFSIZE+1)); serait plus juste...
du coup: buffer=p+(i*(BUFSIZE+1));
histoire de ne pas perdre le dernier 0 d'un cinglé qui a tapé les 1024 caractères...
Enfin, j'ai toujours trouvé étrange de mettre sizeof(char) pour les caractères, si tant est qu'on se sert tous des instructions memcpy ou memcmp pour copier des octets, et implicitement, des caractères.A partir de là, la notion de caractère ne peut être réellement un type dont la taille pourra varier sans que tous les programmes actuels soient à jeter...
Marsh Posté le 11-05-2001 à 11:38:53
Comment je fais en ANSI C pour saisir puis afficher une chaine de caractere avec des espace ? une phrase quoi... paske apres la saisi, le printf me renvois toujours le mot situer avant le premier espace pis plus rien...
g bo chercher entre les %s et les %c... ca marche po
C quand meme bete de bloquer la dessus !