2017-02-14 1 views
-2
int main(){ 
    char c; 
    scanf("%c", &c); 
    printf("%d\n", c); 
} 

Angenommen, der Benutzer gibt 71 ein und drückt die Eingabetaste.Scanf-Wert eines 2+ Zeichen?

Warum wird c nicht 71, warum liest es nur die 7 und nicht die 1?

+3

Wissen Sie, was 'char' ist? Wie kann einzelne Variable zwei Werte enthalten? –

+0

@EugeneSh., Ja ein Zeichen – Onedayanam

+1

Und wie kann es dann zwei Zeichen enthalten? –

Antwort

0

Sie scheinen einige wichtige Unterscheidungen zu verpassen.

Die Funktion scanf übernimmt als Eingabe eine Zeichenkette. Jedes Zeichen ist eine 8-Bit-Ganzzahl, die eine von:

  • eine bedruckbaren Glyphe wie ‚7‘ oder ‚1‘ oder ‚G‘
  • ein Steuerzeichen wie Neue-Zeile (‚\ n‘) oder bel ('\ a')
  • der Null-Terminator (\0), mit dem das Ende einer Zeichenkette markiert wird.

(Ich nehme ASCII für Einfachheit, andere Kodierungen sind verfügbar).

Die druckbaren Zeichen erscheinen auf Ihrem Bildschirm als Buchstaben, Zahlen oder Symbole, wenn Sie sie drucken. Die Steuerzeichen steuern, was Ihr Terminal/Anzeigegerät tut (Newline bewegt den fiktiven Cursor zur nächsten Zeile und bel lässt einige Endgeräte einen hörbaren Piepston ausgeben).


Was scanf hat mit dieser Kette von Eingabezeichen wird durch den Formatstring gesteuert:

  • %c liest eingehende Zeichen ohne Konvertierung in char Werte.

  • %d konvertiert eine Folge von Zeichen im Bereich '0' .. '9' (also Werte 0x30..0x39) in eine ganze Zahl.

Also, wenn das Zeichen ‚7‘ als ein Zeichen mit %c abgetastet wird, gibt es den Wert 0x37 (dezimal 55) noch ASCII angenommen. Wenn das gleiche Zeichen als eine ganze Zahl mit %d gescannt wird, nimmt sie den Wert 7.

Wenn Sie die Zeichenfolge „71“, als Integer-Wert scannen möchten, verwenden %d (oder %hhd wenn aus irgendeinem Grund Sie wirklich möchte es in einem char speichern).


Nun endlich können wir diesen Kommentar Adresse:

... wenn eine ganze Zahl nur 4 Bytes ist, wie kann ich eine 5-stellige ganze Zahl scannen?

Lassen Sie uns die Stringliteral „12345“ betrachten, die als

im Speicher gespeichert ist
const char literal[6] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x00}; 

Wenn Sie das Scannen mit %d, dann werden diese 5 Nicht-nul Bytes wird als Basis-10 umgewandelt werden Ganzzahl in den Wert 12345.

Wenn Sie jedoch die gleiche Zeichenfolge mit %5c scannen, füllen Sie einen 5-stelligen Puffer mit den Werten {0x31, 0x32, 0x33, 0x34, 0x35} auf. Wenn Sie versuchen, einfach %c zu verwenden, liest es natürlich nur das erste Zeichen, das 0x31 ist.

1

'7' ist ein Zeichen und '1' ist ein Zeichen. Das Zeichen ‚G‘ hat einen Dezimalwert von 71. Typ ‚G‘ und Sie erhalten 71. Wenn Sie für eine Reihe scannen möchten Sie könnte:

int i; 
scanf("%d", &i); 
printf("Value %d = char(%c)", i, (char)i); 

Sobald das System Scanf der ‚7‘ it hatte den einen Charakter, auf den er gewartet hat und hört auf zu hören - deine "1" wurde noch nicht "eingescannt"!

1

Die Anweisung

scanf ("%c", &c); 

bedeutet "ein Byte von der Standardeingabe gelesen und in die variable c legen". Keine Konvertierung ist erfolgt. In Ihrem Beispiel ist das Byte '7', das unter der Annahme, dass das Programm in einem Gebietsschema ausgeführt wird, das die Zeichencodierung ASCII (oder eine Obermenge wie UTF-8) verwendet, '\x37' oder 55 ist. Beachten Sie, dass der Wert, der c zugewiesen wird, von der Zeichencodierung abhängt, die von dem aktuellen Gebietsschema verwandt wird.

Im Vergleich dazu eine Anweisung wie

scanf ("%d", &i); 

bedeutet „Lesen eines oder mehr Zeichen darstellen Dezimalziffern von der Standardeingabe, jene Dezimalziffern in einen ganzzahligen Wert umrechnen, und speichert diesen Wert in den Variablen i ". Beachten Sie, dass der der Variablen i zugewiesene Wert nicht von der Zeichencodierung abhängt, die vom aktuellen Gebietsschema verwendet wird, vorausgesetzt natürlich, dass die Standardeingabe die vom Programm erwartete Codierung verwendet.

Verwandte Themen