int c = getchar()?

Lesezeit: 10 Minuten

ok, also ich lese dieses Buch: Die C-Programmiersprache – von Kernighan und Ritchie (zweite Ausgabe) und eines der Beispiele, bei denen ich Probleme habe, zu verstehen, wie die Dinge funktionieren.

#include <stdio.h>

#define MAXLINE 1000

int getline(char line[], int maxline);
void copy(char to[], char from[]);

int main(int argc, char *argv[])
{
    int len;

    int max;
    char line[MAXLINE];
    char longest[MAXLINE];

    max = 0;
    while((len = getline(line, MAXLINE)) > 1)
    {
        if(len > max)
        {
            max = len;
            copy(longest, line);
        }
    }
    if(max > 0)
        printf("%s", longest);

    getchar();
    getchar();
    return 0;   
}

int getline(char s[], int lim)
{
    int c, i;

    for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
        s[i] = c;
    if(c == '\n')
    {
        s[i] = c;
        ++i;     
    }
    s[i] = '\0';

    return i;
}

void copy(char to[], char from[])
{
    int i;

    i = 0;
    while((to[i] = from[i]) != '\0')
        ++i;
}

die Linie : for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
wo es heißt c = getchar (), wie kann eine ganze Zahl = Zeichen von der Befehlszeile eingegeben werden? Ganzzahlen ja, aber wie werden die eingegebenen Zeichen gespeichert?

Danke im Voraus

  • Sehen Sie auch, was passiert, wenn Sie verwenden char c = getchar() Anstatt von int

    – Antti Haapala – Слава Україні

    13. Februar 2016 um 9:17 Uhr

  • Mögliches Duplikat von Warum muss die Variable, die den Rückgabewert von getchar enthält, als int deklariert werden?

    – phuklv

    22. Februar 2019 um 2:00 Uhr

  • Die allgemeine Regel ist, die Frage mit der besten Sammlung von Antworten zu behalten. Der Zeitunterschied ist nicht relevant Wie sollte mit doppelten Fragen umgegangen werden?

    – phuklv

    22. Februar 2019 um 2:48 Uhr

Im Gegensatz zu einigen anderen Sprachen, die Sie möglicherweise verwendet haben, sind Zeichen in C sind ganze Zahlen. char ist nur ein weiterer ganzzahliger Typ, normalerweise 8 Bit und kleiner als intaber immer noch ein ganzzahliger Typ.

Brauchst du also nicht ord() und chr() Funktionen, die in anderen Sprachen vorhanden sind, die Sie möglicherweise verwendet haben. In C können Sie zwischen konvertieren char und andere Integer-Typen mit einer Umwandlung oder einfach durch Zuweisung.

Sofern kein EOF auftritt, getchar() ist so definiert, dass “ein unsigned char umgewandelt in ein int” zurückgegeben wird (wie fgetc), also wenn es hilft, können Sie sich vorstellen, dass es ein Zeichen liest, ckehrt dann zurück (int)(unsigned char)c.

Sie können dies wieder in eine umwandeln unsigned char nur durch eine Besetzung oder Aufgabe, und wenn Sie bereit sind, einen leichten Verlust an theoretischer Portabilität in Kauf zu nehmen, können Sie es in a umwandeln char mit einer Besetzung oder durch Zuordnung zu a char.

  • In C sind also Zeichen und Ganzzahlen sozusagen “gleich”. und wenn Sie so etwas tun wie myInt = myChar; das funktioniert wegen dort ASCII-Werte?

    – Rhexis

    19. August 2011 um 9:31 Uhr

  • @Flyphe: ziemlich genau, ja. Für C ist ein Zeichen sein numerischer Wert. Tatsächlich sind Zeichenliterale in C wie 'a'Typ haben int anstatt zu tippen char. Der numerische Wert nicht unbedingt haben Um ASCII zu sein, dürfen C-Implementierungen tatsächlich eine andere Codierung wie EBCDIC verwenden, aber es ist ziemlich unwahrscheinlich, dass Sie jemals darauf stoßen werden.

    – Steve Jessop

    19. August 2011 um 9:44 Uhr


  • Beachten Sie, dass der Typ char ein eigener Typ ist: der kleinstmögliche ganzzahlige Typ, normalerweise 1 Byte breit. Es wird also nicht nur zum Speichern von ASCII-Buchstaben verwendet, sondern wird auch häufig verwendet, wenn mit kleinen Zahlen 0-255 (ohne Vorzeichen) oder -128 bis 127 (mit Vorzeichen) gearbeitet wird, um Speicherplatz zu sparen. Hätten Sie ein int verwendet, würden Sie 2 oder 4 Bytes anstelle von 1 benötigen.

    – Ludin

    19. August 2011 um 11:59 Uhr


Benutzer-Avatar
paxdiablo

Das getchar() Die Funktion gibt eine Ganzzahl zurück, die die Darstellung des eingegebenen Zeichens ist. Wenn Sie das Zeichen eingeben ASie erhalten 'A' oder 0x41 zurückgegeben (Upgrade auf eine int und natürlich unter der Annahme, dass Sie sich auf einem ASCII-System befinden).

Der Grund, warum es eine zurückgibt int eher als ein char liegt daran, dass es in der Lage sein muss, beliebige Zeichen zu speichern Plus der EOF-Indikator, bei dem der Eingangsstrom geschlossen ist.

Und für das, was es wert ist, ist das nicht wirklich ein gutes Buch für Anfänger, um damit zu beginnen. Es stammt aus der Zeit, als Effizienz wichtiger war als Lesbarkeit und Wartbarkeit.

Während es zeigt, wie schlau Leute wie K&R waren, sollten Sie sich wahrscheinlich etwas … Neuling-freundlicheres ansehen.

Jedenfalls umfasste die letzte Ausgabe davon C89 und seitdem hat sich einiges geändert. Wir haben C99 durchlaufen und haben jetzt C11 und das Buch wurde nicht aktualisiert, um eines von beiden widerzuspiegeln, also ist es schrecklich veraltet.

  • aber wie kommt es dann, dass es gegen Ende die eingegebenen Zeichen ausdruckt?

    – Rhexis

    19. August 2011 um 9:22 Uhr

  • Ohh ok. also s[i] = c; In der for-Schleife wird jedes Zeichen gepackt und in “s” gespeichert, während immer noch sichergestellt wird, dass es nicht EOF oder \n ist

    – Rhexis

    19. August 2011 um 9:26 Uhr

  • Können Sie ein modernes C-Buch empfehlen, das wirklich gut ist, in dem Sinne, dass es etwas hat, das der Strenge nahe kommt, die wir von Leuten wie K&R oder von 20 oder 30 Leuten auf SO, die häufig auf C antworten, als selbstverständlich ansehen Fragen richtiger stellen, als es gewöhnliche Lehrbücher zu leisten scheinen?

    – Steve Jessop

    19. August 2011 um 9:39 Uhr

  • An dem Buch, das ich verwende, ist nichts auszusetzen, Dennis Ritchie hat die Sprache C entwickelt. Das Verfolgen des Inhalts ist ziemlich einfach. Ich bin mir sicher, dass ich mit der Zeit alles bekommen und alles verstehen werde. Ehrlich gesagt ist das Buch für Anfänger gut geeignet.

    – Rhexis

    19. August 2011 um 10:14 Uhr

  • Ich bin anderer Meinung: Das Buch ist nicht Gut für Anfänger, Sie sollten lernen, wie man lesbaren, wartbaren Code schreibt, nicht unnötig komplexe Einzeiler wie dieses Beispiel. Ein anständiger Compiler wird Ihnen den gleichen zugrunde liegenden Maschinencode liefern, egal ob Sie ihn mit dieser Monstrosität oder den entsprechenden fünf Zeilen anständigen Quellcodes füttern. Lassen Sie mich bei Ihrem ersten Code-Review wissen, wie es läuft, wenn Sie so etwas produzieren 🙂

    – paxdiablo

    19. August 2011 um 12:02 Uhr

Benutzer-Avatar
cdhowie

Das C char type ist 8 Bit, was bedeutet, dass es den Bereich von Integern speichern kann (abhängig davon, ob es signiert ist oder nicht und der C-Standard nicht vorschreibt, was es ist, wenn Sie es nicht angeben) entweder -128 bis 127 oder 0 bis 255 (255 verschiedene Werte; dies ist der Bereich von ASCII). getchar() kehrt zurück int, was mindestens 16 Bit sein wird (normalerweise 32 Bit auf modernen Maschinen). Dies bedeutet, dass es die Reichweite von speichern kann charsowie weitere Werte.

Der Grund, warum der Rückgabetyp ist int ist da der besondere Wert EOF wird zurückgegeben, wenn das Ende des Eingabestreams erreicht ist. Wenn der Rückgabetyp wäre chardann gäbe es keine Möglichkeit zu signalisieren, dass das Ende des Streams erreicht wurde (es sei denn, es würde einen Zeiger auf eine Variable nehmen, in der diese Bedingung aufgezeichnet wurde).

  • Das C char ist nicht garantiert signiert, und es ist gar nicht so ungewöhnlich, dass er unsigniert ist. Dies ist beispielsweise bei ARM mit gcc und anderen Compilern standardmäßig der Fall.

    – Steve Jessop

    19. August 2011 um 9:32 Uhr


  • Es ist meines Wissens auch nicht garantiert, dass es unsigniert ist.

    – CDhowie

    19. August 2011 um 9:33 Uhr

  • Richtig, es ist auch nicht garantiert, dass es unsigniert ist. Es ist garantiert die gleiche Darstellung wie eine von signed char und unsigned char, also ist seine Reichweite die gleiche wie eine von diesen. Sie können nur nicht sicher sagen, dass es -128 bis 127 ist. Sie können auch nicht sicher sagen, dass es 8 Bit sind, aber es ist sehr modisch, dass es 8 sind, die Ausnahmen sind alte 9-Bit-Mainframes und einige DSP-Chips die 16- oder 32-Bit-Zeichen haben.

    – Steve Jessop

    19. August 2011 um 9:33 Uhr


  • Sie müssen keinen Zeiger senden, es gibt feof() und ferror(), aber leider keine schnellen Makroversionen davon. Das Erweitern von Zeichen auf int, nur um einen speziellen EOF-Rückgabewert einfügen zu können, scheint eine wirklich schlechte Optimierungswahl zu sein, die C komplizierter und eingeschränkter macht. Wie NULL und ‘\0’-terminierte Strings. C++ hat den Fehler EOF/char/int behoben: Sie testen den Stream, nicht das “Zeichen”.

    – potrzebie

    9. Juni 2014 um 15:04 Uhr

  • Das C char Typ ist nicht garantiert genau 8 Bits. Das ist es garantiert wenigstens 8 Bit, aber CHAR_BIT vielleicht nicht genau 8.

    – Govind Parmar

    22. Februar 2019 um 17:47 Uhr

Lass uns jetzt ein Spiel der Logik spielen.

Char ist auch eine Art Ganzzahl, die einen kleineren Bereich als int hat, genauer gesagt 8 Bit, dh 1 Byte. Wie wir alle wissen, bestehen Integer-Typen aus signed ( default ) und unsigned. Was char anbelangt, ist der Bereich von signed -127 ~ 128 und der Bereich von unsigned 0 ~ 255. Jetzt kennen wir den Typ und die “Fähigkeit” von signed und unsigned char.

Wir Menschen verstehen Zeichen, während der Computer nur binäre Folgen erkennt. Daher müssen alle Arten von Programmiersprachen ein Modell bereitstellen, um mit der Umwandlung von Zeichen in binäre Sequenzen umzugehen. ASCII-Code ist der Standard für die Abbildung, der in C und vielen anderen Programmiersprachen galt. Es braucht 0 – 255, um Grundzeichen wie 0-9, az und AZ sowie übliche Sonderzeichen zu codieren.

Sie fragen sich vielleicht, dass unsigned char genau die richtige Wahl ist. Die Programmierung sollte jedoch wissen, wann sie aufhören soll. Der einfachste Weg ist, einen speziellen Wert zu treffen, ein negativer Wert ist eine gute Wahl, da größere positive Werte für andere Sprachen verwendet werden können. Schließlich wählte C -1, was häufiger als EOF bezeichnet wird.

Jetzt haben wir den Punkt. Signed char reicht nicht aus, um ASCII-Zeichen zu codieren, während unsigned keinen Platz für den Abschlusswert lässt. Wir benötigen einen größeren Bereich, um dies auszugleichen, dh den int-Typ. Scharf?

Danke für die Antwort von @cdhowie, es hat mich wirklich entzündet.

Jedes Zeichen (einschließlich Zahlen), das auf der Befehlszeile eingegeben wird, wird als Zeichen gelesen und jedes Zeichen hat einen ganzzahligen Wert, basierend auf seinem ASCII-Code http://www.asciitable.com/.

  • Der C-Standard garantiert nicht wirklich, dass ASCII der von der Implementierung verwendete Zeichensatz ist, obwohl Sie einen langen Weg zurücklegen würden, möglicherweise in ein Museum, um eine C-Implementierung zu finden, in der dies nicht der Fall ist.

    – Steve Jessop

    19. August 2011 um 9:30 Uhr

  • Ja, aber der Einfachheit halber dachte ich, dass das angenommen wurde

    – Matt

    19. August 2011 um 9:33 Uhr

  • @Steve: äh, wir arbeiten jeden Tag an Maschinen, die EBCDIC verwenden. Tatsächlich würde ich garantieren, dass jede einzelne Ihrer Banktransaktionen an einem solchen Automaten endet. Die ehrwürdigen System z Mainframes, die nach so vielen Jahrzehnten immer noch die Finanzen des Planeten regeln 🙂

    – paxdiablo

    19. August 2011 um 9:41 Uhr

  • @paxdiablo: ausgezeichnet, nicht bemerkt. Hoffentlich lassen sie die Leute nicht einfach zur Tür hereinspazieren und anfangen, diejenigen zu programmieren, die das Bankensystem betreiben. Mein Punkt ist nur, dass Sie sich anstrengen müssen, um von ASCII wegzukommen, es wird wahrscheinlich nicht zufällig passieren, während Sie nicht hinsehen.

    – Steve Jessop

    19. August 2011 um 9:53 Uhr


Benutzer-Avatar
Yogeesh Seralathan

Die Antwort auf Ihre Frage ist beantwortet. Aber fügen Sie einfach 1 weitere Sache hinzu.

Da Sie Variable deklarieren c als int. Es ist ziemlich klar, dass Sie Werte von nehmen 0 to 9 mit ASCII-Wert von 48-57. Sie können dem Code also einfach eine weitere Zeile hinzufügen.

c = c-48.

  • Der C-Standard garantiert nicht wirklich, dass ASCII der von der Implementierung verwendete Zeichensatz ist, obwohl Sie einen langen Weg zurücklegen würden, möglicherweise in ein Museum, um eine C-Implementierung zu finden, in der dies nicht der Fall ist.

    – Steve Jessop

    19. August 2011 um 9:30 Uhr

  • Ja, aber der Einfachheit halber dachte ich, dass das angenommen wurde

    – Matt

    19. August 2011 um 9:33 Uhr

  • @Steve: äh, wir arbeiten jeden Tag an Maschinen, die EBCDIC verwenden. Tatsächlich würde ich garantieren, dass jede einzelne Ihrer Banktransaktionen an einem solchen Automaten endet. Die ehrwürdigen System z Mainframes, die nach so vielen Jahrzehnten immer noch die Finanzen des Planeten regeln 🙂

    – paxdiablo

    19. August 2011 um 9:41 Uhr

  • @paxdiablo: ausgezeichnet, nicht bemerkt. Hoffentlich lassen sie die Leute nicht einfach zur Tür hereinspazieren und anfangen, diejenigen zu programmieren, die das Bankensystem betreiben. Mein Punkt ist nur, dass Sie sich anstrengen müssen, um von ASCII wegzukommen, es wird wahrscheinlich nicht zufällig passieren, während Sie nicht hinsehen.

    – Steve Jessop

    19. August 2011 um 9:53 Uhr


1359210cookie-checkint c = getchar()?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy