2016-04-14 5 views
0

Ich habe folgende C-Programm:Multiple Input für laufende Programm

#include<stdio.h> 
main() 
{ 
    char buf[64]; 
    gets(buf); 
    printf("Your input: %s\n", buf); 
    gets(buf); 
    printf("Your input: %s\n", buf); 
} 

Ich möchte das Programm zum Senden von Daten von Rohren oder Umleitung verwenden. Das Problem ist, dass das Programm nicht darauf wartet, dass der zweite neue Daten eingibt.

beispiel

$ echo "a" | ./test 

Ausgang:

Your input: a 
Your input: a 

Wie kann ich lasse sende das Programm warten, bis die Benutzereingabe an jeden bekommt Rohre oder Umleitung verwenden. P. Ich habe keine persistion um nach/proc/$ pid/fd/0 zu schreiben und ich muss den Code nicht ändern.

Jede Hilfe wäre willkommen.

+1

1.) Verwenden Sie 'gets()' nicht. 2.) versuche 'scanf ("% 64s ", buf);' Dies verhindert einen Pufferüberlauf. Es könnte bessere Lösungen geben. Nur meine erste Idee, was du benutzen darfst. – Enkelli

+0

Vielen Dank, aber ich muss den Code nicht ändern. –

+0

Sie wollen es nicht ändern? oder du kannst nicht? Entschuldigung, ich habe den letzten fraglichen Satz nicht gelesen. Aber ich verstehe immer noch nicht, was es bedeutet. Zu meiner ersten Antwort - es ist keine Lösung, nur ein paar Tipps. – Enkelli

Antwort

0

Wenn Sie die Leitungen | verwenden, um Daten in einen Befehl einzugeben, wird die Verbindung zum (Eingangsteil) Ihres Terminals getrennt. gets liest die erste Zeile "a\n" und schreibt diese an die buf als "a\0". Dann wird das Ende der Pipe oder EOF (Ende der Datei) erreicht.

Ihre zweite gets dann tut nichts (wie es nach EOF nichts zu lesen gibt) und lässt buf allein; buf enthält immer noch "a\0", die ordnungsgemäß gedruckt wird.

Weitere Hinweise:

  • Als ich tun/O, die von Natur aus jederzeit ausfallen kann, müssen Sie nach jedem auf Fehler überprüfen und jeden Anruf oder schlechte Dinge passieren. Trainieren Sie sich dazu und sparen Sie viel Zeit für die Fehlersuche.

  • Niemals eine E/A wie gets(buf), weil es zu Pufferüberläufen führen wird, der Fluch der Computersicherheit. Wenn Sie beliebige Daten eingeben, müssen Sie einen Aufruf verwenden, mit dem Sie die Anzahl der geschriebenen Bytes begrenzen können. Die Manpage für gets enthält den Satz "Niemals diese Funktion verwenden" ganz oben. Sie können andere, bessere Funktionen finden, read ist eine Basis, und wenn Sie in C++ sind, wird es viele andere Standardlösungen dafür geben.

+0

'buf' enthält kein Zeilenvorschubzeichen. –

+0

Stimmt, ich habe das geklärt. – AnoE