read() stdin in c?
Ich habe eine kurze kleine Frage mit der read() Befehl.
Ich bin echt eingerostet in C, und leider ist mein Aktueller Auftrag hat mich die Programmierung in C.
Wir benötigen zum Lesen von stdin, mit der read () - und nicht fgets und dergleichen.
Also habe ich eine einfache while-Schleife:
int n, i;
char buffer[257], *input;
while((n=read(fileno(stdin), buffer, 256)) > 0)
{
buffer[n] ='\0';
if(buffer[n] = '\n') break;
write(input, buffer, strlen(buffer));
}
So, ich bin nicht sicher, wie man diese Schleife stoppen beim drücken von enter (Ende der Zeile), so dass ist, warum ich den break-code, aber ich weiß nicht, ob das richtig ist vollbracht.
Das ganze Ziel versuche ich zu erreichen, wird die Eingabe von stdin in der Zeiger 'input'
(Ich bin wirklich schlecht im Verständnis Zeiger so mit mir tragen 🙂 )
Mein problem ist, dass ich immer speicherzugriffsverletzungen, wenn ich drücken Sie die EINGABETASTE.
Ich wünschte, ich könnte die Verwendung der Funktion fgets denn dann würde all dies gelöst werden, mit einem einfachen
input = fgets(buffer, 256, stdin);
Verflixte Hausaufgaben 🙁
Sowieso, wenn jeder von Euch könnte mich in die richtige Richtung, ich würde es wirklich schätzen. Danke!
if(buffer[n] = '\n') break;
Ich denke, dass Sie bestimmtif(n && buffer[n-1] == '\n') break;
( oder vielleicht sogarif(n==1 && buffer[n-1] == '\n') break;
. Auchwrite(input, buffer, strlen(buffer));
ersetzt werden könnte durchwrite(input, buffer, n);
- Ihr code ist wie
x = 1; if (x == 0) { /*...*/ }
. Erkennen Sie das problem?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wirst du etwa alles falsch. Erstens
write
ist ein system call, mit dem schreiben zu einem öffnen Sie den Datei-Deskriptor. Ihreinput
ist nichts, das wie ein Datei-Deskriptor ist gewonnen durch den Aufruf deropen
syscall erste, oder auf einen der immer-offen-Dateien, wie z.B.stdin
,stdout
oderstderr
. Nicht zu erwähnen, dass ein file-Deskriptor ist eineint
auf Linux.Außerdem sollten Sie Bedenken, dass die übernahme Ihrer Eingaben auf
stdin
endet mit einem Zeilenumbruch nicht Recht zu sein die ganze Zeit. Ihr Programm möglicherweise einige Inhalte auf die standard-Eingabe, die nicht enthalten keine Zeilenumbrüche, zum Beispiel die Inhalte von einer Datei (weitergeleitetstdin
), oder die Eingabe von der Tastatur, kann einfach am Ende mit einemCtrl-D
(EOF) statt der "return" - Taste.Am Anfang aller, dass, ein nicht initialisierter Zeiger nicht auf eine gültige Speicher. Die Erklärung der
char *input
nicht geben Ihnen keine Rechte zum schreiben/Lesen des Speichers bezeichnetinput
es sei denn, Sie weisen Sie einige Speicher, dass dieser Zeiger auf den ersten.Kopieren von Zeichenketten in C wird erreicht durch die Verwendung von Funktionen deklariert
<string.h>
. Sie agieren auf C-strings, z.B. Sequenzen von Zeichen, abgeschlossen durch\0
. In diesem Fallread()
nicht kündigen, seinen Ausgang von einem\0
, in welchem Fall Sie wollen, verwenden Sie diememcpy
- Funktion statt. Warum gehst du nicht einfach versuchen Sie zu Lesen direkt ininput
, obwohl? Es macht nicht viel Sinn, zu Lesen, umbuffer
erste, einfach zu kopieren Sie die Daten von einem anderen Stück Speicher später auf.Auch, die Spezifikation von
read
Staaten, die es liest bis zu zählen bytes aus der Datei-Deskriptor. Das bedeutet, dass, wenn Ihrbuffer
erklärt wirdchar[257]
, dann sollten Sie rufenread(stdin,buffer,257)
, nicht 256. Es wäre wahrscheinlich auch besser geeignet, um einfach zu erklären, die Puffer als eine 256-element-array.Ich hoffe, ich habe begradigt, ein paar Sachen für Sie.
Ihre
input
schien das nicht überall gültig. Sie müssen entweder reservieren von Speicher (und freigeben, wenn Sie fertig sind) oder es zeigen Sie auf gültigen Speicher.Auch
=
ist Zuordnung;==
ist-Vergleich.if(buffer[n] == '\n') break;
könnte niemals wahr sein, da die Linie genau vor der Satz, dass der Charakter auf 0. Auch write() schreibt in ein file-descriptor, keine char-Zeiger.