Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
6006 connectés 

 


Dernière réponse
Sujet : [c] question con mais bon.... chaine de caracteres.
LogonSystem Euh... :D  
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...
 :p

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
LogonSystem Euh... :D  
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...
 :p
gilou

kill9 a écrit a écrit :

n'empeche, c'est quand meme mieux avec char buffers[]; :lol:




 
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]

Aricoh argglglll, mais je vais te le me le !!!
 
:lol:
kill9 n'empeche, c'est quand meme mieux avec char buffers[]; :lol:
Aricoh

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 + :lol:

kill9 Arf...decidement c'est pas mon jour(qui a dit que c'etait jamais mon jour ?) j'avais mal lu.
kill9 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.
Paranoid_Android 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 !  :D  
 
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 !  :D c'k'on s'marre !
Aricoh Vi vi, c'était fait exprès :sarcastic:
 
et notre camarade, ben il l'a pas vu ...
 
Arf, moi non plus d'ailleurs ! :p
 
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é
 
:lol:
LogonSystem 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  :lol:
Aricoh

paranoid_android a écrit a écrit :

sinon t'as oublier un ; apres le char phrase[51]




 
c'était pour voir si tu suivais :lol:

Paranoid_Android Merci bcp msieur !!  
 
sinon t'as oublier un ; apres le char phrase[51]  :D (oui oui j'fais le malin )
 
merci encore Aricoh et les autres :jap:
Aricoh 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]

Paranoid_Android 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 ? :D
El_gringo Tu bosse sur quoi !? Turbo C ?
tgrx 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... :??:
Paranoid_Android 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  :pt1cable:  
 
C quand meme bete de bloquer la dessus !  :jap:

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)