2017-07-06 6 views
-1

Je crée un petit programme qui copie simplement le texte d'un fichier input.txt dans un fichier output.txt. Cela fonctionne sans problème apparent avec la commande:Texte imprimable masqué

./myCopier.txt <rand.txt> randout.txt 

sur un compilateur GCC89, utilisé à des fins didactiques.

#include<stdio.h> 

int main(void){ 
     int c; 

     while ((c = getchar()) != EOF) 
       putchar(c); 

     /*The text in printf() does not appear anywhere*/ 

     printf("My theories and toughts!\n"); 
} 

Plus tard, j'ajouter printf() afin d'imprimer mes réflexions sur la façon dont le programme a fonctionné. Il compile sans erreurs ou avertissements même avec des paramètres restrictifs (-Wall), mais ce texte n'apparaît à aucun endroit. Par n'importe quel endroit, je veux dire à la fois output.txt et la sortie standard.

Je pense que:

  1. La commande ./myCopier.exe seule créer clairement une boucle sans fin. Sans saisie de texte, il n'y a pas de caractère EOL, donc la commande print() n'est jamais atteinte.
  2. Alors pourquoi, lorsque l'entrée est fournie, la commande printf() n'a aucun effet apparent? Je m'attendrais à ce que le texte de printf() apparaisse sur la sortie standard, juste au moment où la boucle se ferme et output.txt est créé. Pourquoi cela ne se produit-il pas? Ma théorie est que ./myCopier.txt <rand.txt> randout.txt ne le permet pas. Pour une raison quelconque, cela fait que le programme ne transfère l'entrée qu'à la sortie, "ignorer" tout ne vient pas de l'entrée. Ai-je raison? Si oui, pourquoi?

Si vous êtes intéressé par le problème avec des détails plus profond, voici le code assembleur:

http://text-share.com/view/79f31f38

+0

Pourriez-vous montrer quel assemblage est généré par votre compilateur? – Siguza

+1

Aussi, si la mémoire me sert bien, l'autorisation d'omettre une instruction explicite 'return' dans' main() 'a été introduite dans C99, ce qui signifierait que la norme C89 invoque un comportement indéfini. – Siguza

+0

Je pense qu'il y a un malentendu quelque part, que ce que vous pensez ne se produit pas. Le troisième point exigerait que quelque chose soit magique, pour faire cette comparaison. Peut-être avez-vous ajouté le 'printf()', mais avez échoué à recompiler après et continué à exécuter le vieux binaire? – unwind

Répondre

3

Omettre la déclaration de retour dans le principal() provoque un comportement non défini à C89/C90.

Normalement, le retour de main() force le buffer de sortie à être vidé. Si vous omettez l'instruction return, tout peut arriver.

  • Essayez d'ajouter return 0 à la fin de main() comme cela a été nécessaire à C90. GCC en mode c90/gnu90 vous avertira autrement: "le contrôle atteint la fin de la fonction non-nulle". Essayez d'ajouter fflush(stdout);.
+0

Cela sonne bien, mais [OP revendiqué dans les commentaires] (https://stackoverflow.com/questions/44947173/hidden-printable-text#comment76869929_44947173) pour avoir ajouté l'instruction 'return' sans succès. Possible que OP a été confondu, a oublié de compiler avec des changements, etc .... –

+0

@DavidBowling S'il y a une déclaration de retour explicite, le programme est nécessaire pour vider les tampons et ainsi imprimer le texte sur stdout d'ici là (sinon avant) . Si ce n'est pas le cas, le compilateur est non conforme. – Lundin

+0

D'accord, et c'était aussi ma première pensée. Juste en soulignant le commentaire de OP. –