web-dev-qa-db-fra.com

Lecture \ r (retour chariot) vs \ n (nouvelle ligne) à partir de la console avec getc?

J'écris une fonction qui attend essentiellement que l'utilisateur tape sur "Entrée" puis fait quelque chose. Ce que j'ai trouvé qui fonctionne lors des tests est le suivant:

#include <stdio.h>

int main()
{
        int x = getc(stdin);
        if (x == '\n') {
                printf("carriage return");
                printf("\n");
        }
        else {
                printf("missed it");
                printf("\n");
        }
}

La question que j'ai et ce que j'ai essayé au début était de faire: if (x == '\r') mais lors des tests, le programme ne m'a pas surpris à taper enter. Le '\n' Semble correspondre à moi en appuyant sur Entrée depuis la console. Quelqu'un peut-il expliquer la différence? De plus, pour vérifier, l'écrire comme if... == "\n" Signifierait la chaîne de caractères littérale? c'est-à-dire que l'utilisateur devrait littéralement entrer "\n" à partir de la console, correct?

23
MCP

\n Est le caractère de nouvelle ligne, tandis que \r Est le retour chariot. Ils diffèrent dans ce qui les utilise. Windows utilise \r\n Pour indiquer que la touche Entrée a été enfoncée, tandis que Linux et Unix utilisent \n Pour indiquer que la touche Entrée a été enfoncée.

Ainsi, j'utiliserais toujours \n Car il est utilisé par tous; et if (x == '\n') est la bonne façon de tester l'égalité des caractères.

40
Whymarrh

Le "\ n" est le "saut de ligne" et le "\ r" est le retour chariot. Différents systèmes d'exploitation géreront les nouvelles lignes de manière différente, comme

Windows

S'attend à ce qu'une nouvelle ligne soit une combinaison de deux caractères, '\ r\n'.

Linux\Unix et Mac OS moderne

Utilise un seul "\ n" pour une nouvelle ligne.

Mac OS classique

Utilise un seul "\ r" pour une nouvelle ligne.

Fondamentalement, j'utiliserais if (x == '\n') car il est actuellement utilisé par tous les systèmes d'exploitation modernes.

13
josephthomas

N'oubliez pas non plus que si vous saisissez 25 caractères et Entrée, le premier getc ne reviendra pas tant que les 25 caractères n'auront pas été saisis et que vous n'aurez pas appuyé sur Entrée. La lecture d'un caractère au moment de sa saisie nécessite un code spécifique à la plate-forme. Par conséquent, il serait préférable de simplement lire la ligne entière en exécutant fgets dans une chaîne, en coupant la nouvelle ligne et en traitant la ligne d'entrée dans son ensemble.

3
Alex Measday

Il existe plusieurs niveaux d'abstractions pour représenter une nouvelle ligne - le runtime du langage de programmation, l'éditeur de texte et le système d'exploitation. CR (retour chariot) et LF (saut de ligne) sont deux caractères de contrôle définis en ASCII. Certains autres encodages de charateur peuvent également définir un caractère "nouvelle ligne". La touche Entrée de n'importe quel clavier transmet une signification de "au début de la ligne suivante". Le clavier décide comment mapper la touche Entrée à son ou ses caractères de contrôle correspondants. Certains clavier différencient également les touches Entrée et Retour - laissez la touche Entrée être la nouvelle ligne et la touche Retour être retour chariot. Dans un clavier ANSI standard, il n'y a que la touche Entrée, qui est mappée à un caractère de retour chariot (13) en ASCII. Il s'agit donc du contenu réel qui est envoyé au système d'exploitation par le périphérique. Cependant, différents systèmes d'exploitation décident de interpréter différemment la touche Entrée. Ainsi, dans un système de type Unix, tout retour chariot est traduit en un charateur de saut de ligne (10 en ASCII) avant d'être remis au programme qui reçoit l'entrée. Et sous Windows, un CR est traduit en deux caractères - un CR suivi d'un LF. Cependant, vous pouvez définir le flux d'entrée être en mode brut, auquel cas le programme obtient ce que le clavier envoie réellement. Maintenant, l'éditeur entre en jeu. Lorsque l'éditeur reçoit un CR de stdin en mode brut, il sait que le CR correspond à la touche Entrée du clavier (hypothèse sur le clavier) et il est censé afficher une nouvelle ligne à l'écran. En mode brut, il doit appeler l'appel système d'écriture pour générer un CR + LF. Si le flux de sortie n'est pas en mode brut, l'éditeur de texte doit sortir la séquence spécifique au système d'exploitation telle que LF sous linux.

Enfin, le runtime du langage peut également interpréter la nouvelle ligne à sa manière. Par exemple, la norme C indique Lors de l'écriture d'un fichier en mode texte, "\ n" est traduit de manière transparente dans la séquence de saut de ligne native utilisée par le système, qui peut être plus longue qu'un caractère. Lors de la lecture en mode texte, la séquence de saut de ligne native est traduite en "\ n". En mode binaire, aucune traduction n'est effectuée, et la représentation interne produite par '\ n' est sortie directement. Notez que '\ n' et '\ r' sont des caractères spécifiques au langage qui représentent LF et CR respectivement, qui sont populaires dans les langages de type C. Mais tous les langages ne doivent pas utiliser cette notation.

Pour votre deuxième question, "\ n" est '\ n' suivi d'un terminateur '\ 0'. Il n'y a aucun moyen d'entrer un "\ 0" à partir de la console.

1
Tong Zhou