printf("%s",tampon[i]);
Ca sert à quoi à part afficher n'importe quoi à l'ecran et eventuellement planter ?
Bon, pour le plantage, je crois que ça mérite un peu plus d'explications (autant je préfère ne pas donner de solutions toutes faites la plupart du temps, autant certains points diffciles méritent d'être expliqués)... read() lit au plus N octets (*) et les place dans le tampon qu'on lui donne en paramètre. Au contraire des fonctions de la bibiothèque standard dédiées au traitement de chaînes de caractères, read() NE met PAS de caractère '0円' pour terminer la chaîne (c'est une lecture binaire). Au contraire, printf() attend une chaîne de caractères au sens C, i.e. terminée par '0円'. D'où un gros souci potentiel...
Dans ton cas, la chaîne de format "%s" spécifie qu'on affiche le contenu de tampon[i] (supposé de type char *) sur la sortie standard, jusqu'à soit le premier caractère d'espacement, soit la fin de la chaîne. Donc :
- si tampon[i] contient une espace, alors printf s'arrète là ;
- sinon elle continue jusqu'à la fin de tampon[i], et essaye d'aller plus loin. Elle déborde donc le tampon et, au sens de la norme C, cause un comportement indéfini de ton programme.
En pratique, ce comportement indéfini se traduira très probablement soit par l'affichage de données supplémentaires (qui traînent sur la pile), soit par une erreur de segmentation, soit le premier cas suivi du second.
(*) Sans aller regarder la doc de plus près, je suppose que c'est le read de POSIX. Dans ce cas on a de plus CHAR_BIT == 8, et on peut donc traduire joyeusement "byte" par "octet" sans se soucier d'architectures ésotériques comme certains mainframes ou DSP.
[^] # Re: alors
Posté par alf . En réponse au message programme c qui émule la commande cat (amélioration). Évalué à 3.
read() lit au plus N octets (*) et les place dans le tampon qu'on lui donne en paramètre. Au contraire des fonctions de la bibiothèque standard dédiées au traitement de chaînes de caractères, read() NE met PAS de caractère '0円' pour terminer la chaîne (c'est une lecture binaire). Au contraire, printf() attend une chaîne de caractères au sens C, i.e. terminée par '0円'. D'où un gros souci potentiel...
Dans ton cas, la chaîne de format "%s" spécifie qu'on affiche le contenu de tampon[i] (supposé de type char *) sur la sortie standard, jusqu'à soit le premier caractère d'espacement, soit la fin de la chaîne. Donc :
- si tampon[i] contient une espace, alors printf s'arrète là ;
- sinon elle continue jusqu'à la fin de tampon[i], et essaye d'aller plus loin. Elle déborde donc le tampon et, au sens de la norme C, cause un comportement indéfini de ton programme.
En pratique, ce comportement indéfini se traduira très probablement soit par l'affichage de données supplémentaires (qui traînent sur la pile), soit par une erreur de segmentation, soit le premier cas suivi du second.
(*) Sans aller regarder la doc de plus près, je suppose que c'est le read de POSIX. Dans ce cas on a de plus CHAR_BIT == 8, et on peut donc traduire joyeusement "byte" par "octet" sans se soucier d'architectures ésotériques comme certains mainframes ou DSP.