Est-ce que stdin contient déjà un caractère de retour chariot (\ r)?

Dans une réponse SO, j’ai écrit ce code:

char fail_on_eof (int c) { if (c == EOF) exit (EXIT_FAILURE); return (char) c; } void skip_to_next_line (void) { char c; do { c = fail_on_eof (getchar ()); } while (c != '\n'); } 

Je me demandais si des terminaux pouvaient renvoyer '\r' (ce qui est couvert par le code ci-dessus tant qu’il y a aussi un '\n' en fin de ligne).

Est-ce que stdin contient jamais '\r' (sur n’importe quelle plate-forme)? Qu’en est-il de la redirection des entrées: stdin fonctionne-t-il toujours en mode texte?

Bien sûr, c’est facile. Vous pouvez lire un fichier contenant ce caractère ou faire quelque chose comme (sous Linux et systèmes d’exploitation similaires):

 printf "\r" | yourProgram 

Ou même à partir d’un programme de terminal qui permet des échappements, tels que CTRL-V CTRL-M .

Toutefois, cela n’est pas considéré comme une fin de ligne dans le monde C, qui souscrit à la méthode LF pour indiquer une fin de ligne. À partir de C11 7.21.2 Streams /2 :

Un stream de texte est une séquence ordonnée de caractères composée de lignes, chaque ligne étant composée de zéro ou plusieurs caractères plus un caractère de fin de ligne.

Il peut être nécessaire d’append, de modifier ou de supprimer des caractères en entrée et en sortie pour se conformer à différentes conventions en matière de représentation de texte dans l’environnement hôte.

En d’autres termes, bien que certains systèmes utilisent un caractère de fin de ligne différent dans l’environnement sous-jacent, nombre d’entre eux effectuent une traduction automatique dans l’environnement C pour garantir que le code fonctionne comme prévu.