2017-11-28 4 views
-3

Ich habe versucht, Code unten, aber die Ergebnisse sind nicht korrekt. Ich denke, dass etwas mit Puffergröße falsch implementiert werden kann.Read() Ganzzahl in c

int f(int* as) { 
    *as = read(STDIN_FILENO, as, sizeof(int)); 
} //i print 123 

int s; 
f(&s); 

printf("%d",s); // prints 4 
+2

Warum denken Sie, die Ergebnisse aren‘ t richtig? Was erwartest du zu passieren? Was geben Sie dem Programm? Versuchen Sie, ein [mvce] (https://stackoverflow.com/help/mcve) zu geben, indem Sie Input eingeben und sagen, was Sie erwarten und warum Sie denken, dass es falsch ist. –

+0

Es ist wahrscheinlich die Größe, die von der 'read()' Funktion zurückgegeben wird. –

+0

@ChrisDodd Ich möchte den gelesenen Wert in 's' speichern - also in diesem Fall 123. Ich weiß nicht, warum die Größe statt Wert zurückgegeben wird, geschieht dies, weil' sizeof (int) '? –

Antwort

0

Zwei Dinge, die das Programm verhindern, dass das Ergebnis, das Sie

erwarten geben

1) read mit von der Standardeingabe (Zeichen) und speichern, die in eine (binäre) integer lesen

2) das Ergebnis der read in derselben ganzen Zahl zu speichern, den (falschen) Wert in 1)

einen Blick auf scanf oder fgets (atoi ...), hat eine zu lesen, gespeicherte Überschreiben Zeichen-Array (string), dann wandelt die Zeichen in eine binäre Zahl zu lesen, zum Beispiel

char str[20]; 
fgets(str, 20, stdin); 
int s = atoi(str); 

read Version

char str[20]; 
ssize_t nread = read(STDIN_FILENO, str, 20); 
int s = atoi(str); 

Siehe what an integer is,

+0

Warte, also gibt es keine Möglichkeit, es durch 'read()' zu bekommen? Ich habe eine Zuweisung, implementieren 'scanf()' ohne Bibliotheksfunktionen außer 'read()' .. –

+0

Natürlich kann es, siehe bearbeiten. Zum Lesen von Strings bevorzugen wir jedoch 'fgets', die jeweils eine Zeile lesen (maximale Größe oder bis' \ n'); 'read' ist eine Funktion der unteren Ebene, die für Binärdateien verwendet wird, wenn Sie genau eine bestimmte Größe lesen möchten. Funktioniert auch. (und 'fgets' ruft irgendwann' read') auf. –

+0

Okay, ich habe die Idee, aber 'atoi' ist auch" verboten ". Sollte ich darüber nachdenken, ein paar Hinweise zu machen und nach' int * 'zu werfen? –