Reading \ r (carriage return) vs \ n (newline) van console met getc?

Ik schrijf een functie die in principe wacht op de gebruiker om “Enter” te raken en dan iets. Wat ik heb gevonden die werkt wanneer tests het onderstaande is:

#include <stdio.h>
int main()
{
        int x = getc(stdin);
        if (x == '\n') {
                printf("carriage return");
                printf("\n");
        }
        else {
                printf("missed it");
                printf("\n");
        }
}

De vraag die ik heb, en wat ik in het begin heb geprobeerd, was te doen: if (x == '\r')maar in testen, het programma heeft me niet opgevangen. De '\n'lijkt te corresponderen met mij die optreden vanuit de console. Kan iemand het verschil uitleggen? Ook, om het te verifiëren, het schrijven als if... == "\n"zou de lettertekenling betekenen letterlijk? d.w.z. de gebruiker zou letterlijk moeten invoeren "\n"van de console, correct?


Antwoord 1, Autoriteit 100%

\nis het nieuwe lijnteken, terwijl \rde koetsvervoer is. Ze verschillen in wat ze gebruikt. Windows gebruikt \r\nOm aan te geven dat de ENTER-toets werd ingedrukt, terwijl Linux en UNIX \ngebruiken om aan te geven dat de ENTER-toets is ingedrukt.

Zo zou ik altijd \ngebruiken omdat het door iedereen wordt gebruikt; en if (x == '\n')is de juiste manier om de karaktergelijkheid te testen.


Antwoord 2, Autoriteit 31%

De ‘\ n’ is de “lijntoevoer” en ‘\ r’ is de wagenrendement. Verschillende besturingssystemen zullen op een andere manier nieuwe regels behandelen, zoals

Windows

verwacht een nieuwe lijn om een ​​combinatie van twee tekens te zijn, ‘\ r \ n’.

Linux \ Unix en Modern Mac OS

Gebruikt een enkele ‘\n’ voor een nieuwe regel.

Klassiek Mac OS

Gebruikt een enkele ‘\r’ voor een nieuwe regel.

In principe zou ik if (x == '\n')gebruiken zoals het momenteel wordt gebruikt door alle moderne besturingssystemen.


Antwoord 3, autoriteit 5%

Onthoud ook dat als u 25 tekens typt en Enter, de eerste getcpas terugkeert als alle 25 tekens zijn ingevoerd en u op Enter drukt. Voor het lezen van een teken op het moment dat het wordt getypt, is platformspecifieke code vereist. Daarom is het misschien beter om gewoon de hele regel te lezen door fgetsin een tekenreeks uit te voeren, de nieuwe regel in te korten en de invoerregel als geheel te verwerken.


Antwoord 4, autoriteit 5%

Er zijn verschillende abstractieniveaus voor het representeren van een nieuwe regel: de programmeertaal runtime, de teksteditor en het besturingssysteem. CR (carriage return) en LF (line feed) zijn twee controlekarakters die zijn gedefinieerd in ASCII. Een andere tekencodering kan ook een “nieuwe regel”-teken definiëren. De Enter-toets op elk toetsenbord geeft de betekenis van “naar het begin van de volgende regel” weer. Het toetsenbord bepaalt hoe de Enter-toets wordt toegewezen aan het bijbehorende besturingskarakter of de karakters. Sommige toetsenborden onderscheiden ook de Enter- en Return-toets – laat de Enter-toets een nieuwe regel zijn en de Return-toets een harde return. In een standaard ANSI-toetsenbord is er alleen de Enter-toets, die is toegewezen aan een wagenretourteken (13) in ASCII. Dit is dus de daadwerkelijke inhoud die door het apparaat naar het besturingssysteem wordt verzonden. Verschillende besturingssystemen besluiten de Enter-toets echter anders te interpreteren. Dus in een Unix-achtig systeem wordt elke regelterugloop vertaald naar een line-feed-charator (10 in ASCII) voordat deze wordt overhandigd aan het programma dat de invoer ontvangt. En in Windows wordt een CR vertaald naar twee tekens – een CR gevolgd door een LF. U kunt de invoerstroom echter instellen op de onbewerkte modus, in welk geval het programma krijgt wat het toetsenbord daadwerkelijk verzendt. Nu komt de editor in beeld. Wanneer de editor een CR ontvangt van stdin in de onbewerkte modus, weet hij dat de CR overeenkomt met de Enter-toets op het toetsenbord (aanname over het toetsenbord) en zou het een nieuwe regel op het scherm moeten weergeven. In de onbewerkte modus zou het de schrijfsysteemaanroep moeten aanroepen om een CR + LF uit te voeren. Als de uitvoerstroom zich niet in de onbewerkte modus bevindt, moet de teksteditor de OS-specifieke reeks uitvoeren, zoals LF op linux.

Ten slotte kan de taalruntime de nieuwe regel ook op zijn eigen manier interpreteren. De C-standaard zegt bijvoorbeeld dat bij het schrijven van een bestand in tekstmodus ‘\n’ transparant wordt vertaald naar de oorspronkelijke nieuwe regelreeks die door het systeem wordt gebruikt, die langer dan één teken kan zijn. Bij het lezen in tekstmodus wordt de oorspronkelijke nieuwe regelreeks terugvertaald naar ‘\n’. In binaire modus wordt er geen vertaling uitgevoerd en wordt de interne representatie geproduceerd door ‘\n’ direct uitgevoerd. Merk op dat ‘\n’ en ‘\r’ taalspecifieke karakters zijn die respectievelijk LF en CR vertegenwoordigen die populair zijn in C-achtige talen. Maar niet elke taal hoeft deze notatie te gebruiken.

Voor uw tweede vraag is “\n” ‘\n’ gevolgd door een ‘\0’ terminator. Er is geen manier om een ‘\0’ in te voeren vanaf de console.

Other episodes