Wie lese ich weiße Raum wird mit scanf in c?
Problem: ich muss in der Lage sein, zu erkennen, Wann zwei Leerzeichen nacheinander stattfinden.
Las ich die folgenden Fragen:
wie liest man einen string aus einer \n getrennte Datei
wie liest scanf mit Leerzeichen
Und ich bin mir bewusst scanf Probleme: http://c-faq.com/stdio/scanfprobs.html
Eingabe im folgenden format:
1 5 3 2 4 6 2 1 9 0
Zwei Leerzeichen zeigt an, dass der nächste Satz von Daten zu handhaben und im Vergleich zu sich selbst. Die Länge der Linie ist unbekannt, und die Zahl oder ganze zahlen in den einzelnen Gruppen ist unbekannt. Zwei Leerstellen ist, die die meisten, die separate Nächster Datensatz".
Während ich verwenden kann, fgets und verschiedenen eingebauten Funktionen, um dieses problem zu lösen, bin ich an dem Punkt, wo die Lösung das problem mit scanf an diesem Punkt wird wahrscheinlich einfacher sein. Allerdings, wenn das nicht der Fall ist, mit fgets strtok-und atoi wird die meisten den job, aber ich muss immer noch identifizieren Sie zwei Leerzeichen in einer Reihe.
Den unter nehmen ganze zahlen, bis ein nicht-integer eingegeben.
while ( scanf ( "%d", &x ) == 1 )
Was ich brauche, es zu tun ist, Lesen Sie Leerzeichen als gut und wenn es zwei aufeinander folgende whitespaces ich werde das Programm etwas anderes zu tun und mit dem nächsten Datensatz.
Und einmal bekomme ich einen weißen Raum, ich weiß nicht, wie zu sagen:
if ((input == "Leerzeichen") && (previousInput == "Leerzeichen")) ya ya da da else (Eingabe == "Leerzeichen") ya ya da da sonst ya ya da da
Ich Schätze Ihre Zeit und ich danke Ihnen für Ihre Hilfe.
Lektion gelernt:
Während eine Lösung für scanf ist unten geschrieben von Jonathan Leffler, der Lösung ein bisschen einfacher war mit getc (durch die Art und Weise, die eine weniger intime Kenntnis der inneren scanf, reguläre Ausdrücke und char). Im Nachhinein eine bessere Kenntnis von regulären Ausdrücken, scanf und char wäre das problem einfacher und natürlich zu wissen, welche Funktionen verfügbar sind und die man hätte am besten ein Einsatz von Beginn an.
- Das ist ein ziemlich grauenvoll-input-format. Wenn Sie in der Verantwortung, Umgestaltung. Wenn, wie ich vermute, Ihr habt eine Hausaufgabe, Pech - Sie sind ein sadistisches paar, Ihre Lehrer.
- Beachten Sie, dass 'white-space' unterscheidet sich von 'zwei Leerzeichen'; 'white space', konventionell bedeutet, dass eine Vielzahl von Zeichen, einschließlich tab und leer (oder-Raum) und manchmal (form feed), vertikaler Tabulator oder newline; und gelegentlich die backspace auch.
- Leffler: zumindest hat er nicht versucht, Sie zu analysieren Whitespace-Zeichen ( compsoc.dur.ac.uk/whitespace )
- Interessant! Du bist wahrscheinlich wissen, Stroustrup ' s - Angebot in diesem Bereich! Zumindest diese Frage ist nur C, nicht C++ zu.
Du musst angemeldet sein, um einen Kommentar abzugeben.
getc
undungetc
sind deine FreundeDemo auf http://ideone.com/xipm1
Bearbeiten Rahhhhhhhhh ... ich hochgeladen, die als C++. Hier wird die genaue gleichen Sache, aber jetzt
C99 strict
( http://ideone.com/mGeVk )getc()
undungetc()
sind ein besserer Weg, es zu tun, als zu versuchen, verwenden Sie nurscanf()
- aber es hatte mit der Frage ein bisschen.getc
ist gut. Denken Sie daran, es gibt einint
(nichtchar
) und man kann nicht schief gehen 🙂Mit
%c
Lesen Sie whitespace-Zeichen, müssen Sie nur alle Daten Lesen und speichern in array. Dann reservierenchar* cptr
und machte sichcptr
auf den Beginn des array, dann analysieren Sie Ihre array-und wenn Sie wollen, Lesen Sie Dezimalzahlen verwenden, können Sie einfachsscanf
aufcptr
während Sie Lesen wollen, hier eine Dezimalzahl, aber man muss die Zeiger in guter position auf array (Anzahl, was Sie wany Lesen)Wenn Sie wirklich wollen
scanf
Typ-Funktionalität, die Sie verwenden könnenfgets
undsscanf
, und verwenden Sie die%n
Planer zu bekommen, scanf, geben Sie Ihrem Programm die offsets für den Beginn und das Ende jedes whitespace-span zur gleichen Zeit, es tut den rest der Arbeit.Sonst Graben die ganze
scanf
Familie. Es ist sehr wahrscheinlich das nutzloseste Teil der standard-Bibliothek ist, meiner Meinung nach.scanf
: eine portable version vongetline
(odergetdelim
), einschließlich reinigen Umgang mit embedded NUL-Zeichen, die erreicht werden können mit so etwas wiescanf("%99[^\n]%n", buf, &cnt);
(wo 99 wird ersetzt durch den Puffer-Größe).scanf("%99[^\n]%n", buf, &cnt);
hat das problem, dass es speichert nichts inbuf
undcnt
wenn die Eingabe beginnt mit'\n'
und Blätter, die'\n'
in stdin. Dies ist nicht wiegetline()
.getline
Sie brauchen, um zu erkennen, dass Fall, und weiter zu wachsen, des Puffers und wiederholen Sie den Anruf, wenn er nicht trifft ein Zeilenumbruch.fscanf
ist nur eine Zutat, damit es funktioniert, nicht das ganze.Was ist Ihre definition von 'white space'?
Ehrlich gesagt, ich glaube nicht, dass ich wollen würde, zu versuchen, mit
scanf()
zu identifizieren doppelte Leerzeichen; fast jede andere Methode wäre viel einfacher.Jedoch, wenn Sie darauf bestehen, tun das nicht verzweifelt sinnvoll, dann möchten Sie vielleicht zu verwenden code-abgeleitet aus den folgenden:
Die eckigen Klammern umschließen eine Charakter-Klasse und die 2 vor es besteht auf höchstens 2 Zeichen aus der Klasse. Haben Sie vielleicht sorgen zu machen über die es Lesen, das neue-Zeile und versucht, mehr Daten zur Befriedigung der Charakter - Klasse- die könnte gelöst werden durch entfernen der newline-Zeichen Klasse. Aber dann, es hängt von Ihrer definition des white space, und ob die Gruppen werden automatisch beendet durch einen Zeilenumbruch oder nicht. Es würde nicht Schaden, reset
sp[0] = '\0';
am Ende der Schleife.Könnte man vielleicht besser die Umkehrung der Felder, um zu erkennen, zwei Leerzeichen vor einer Zahl. Aber das würde nicht in dem gewöhnlichen Fall, also dann würden Sie fallen zurück auf eine einfache
"%d"
- format, um die Nummer zu Lesen (und wenn das fehlschlägt, wissen Sie, Sie haben weder Leerzeichen, noch einen Zahl - Fehler). Beachten Sie, dass%d
kaut oben führenden weißen Raum (definiert durch die Norm) - alle von Ihnen.Je mehr ich schaue, desto weniger mag ich '
scanf()
nur. Erinnern Sie mich nicht, nehmen Sie eine Klasse an Ihrer Universität, bitte.%2[ \t\n]
erfordert mindestens einen, höchstens 2, white space. Also, in deinem code, kann es ja immer 'Arbeit', und Sie haben zu schauen, was ist inchar sp[3];
sehen, was das Trennzeichen ist. Tatsächlich, auf Unix, wenn jemand getippt ^D (EOF) an das terminal, werden Ihre Eingaben sehen können ein 'line' ohne Zeilenumbruch am Ende, und daher nicht weiß spce, und damit würden Sie die Rückkehr des 1. Aber, wie ich schon sagte, ich glaube nicht, dass ich verwenden würdescanf()
; es ist einfach zu verdammt schwer zu bekommen, es zu arbeiten, wie Sie wollen. Das ist, warum ich von Ihnen positiv bewertet werden @pmg ' s Antwort.Hier ist eine Lösung, die verwendet nur die scanf () - Funktion. Ich benutzt sscanf() in diesem Beispiel etwa die gleiche Funktionalität.