2010-10-26 19 views
5

scanf ("% s", str) wird es nicht tun. Es wird aufhören, im ersten Raum zu lesen. gets (str) funktioniert auch nicht, wenn der String groß ist. Irgendwelche Ideen?Wie kann ich eine Zeichenfolge mit Leerzeichen in C lesen?

+2

'gets' nie funktioniert. Es ist ein inhärenter Fehler, den man jemals benutzen kann. Verwende 'fgets'. –

+0

Vielleicht ist es meine Version von c, die überhaupt nicht akzeptiert wird ... Danke! – Johny

+0

@Johnny: Rs Ermahnung gegen die Verwendung von 'gets()' liegt an der Tatsache, dass die Verwendung eine * riesige * Sicherheitslücke in Ihrem Code einführt, nicht, dass Ihr bestimmter Compiler ein Problem damit hat (sollte es nicht; 'bekommt() 'war von Anfang an Teil des C). Es ist seit C99 veraltet und sollte nicht mehr verwendet werden. –

Antwort

13

Verwenden Sie fgets mit STDIN als Dateistream. Dann können Sie die Datenmenge angeben, die Sie lesen möchten und wo Sie sie ablegen möchten.

+0

tatsächlich ist es so: – Johny

+0

fgets (str1, 100, stdin); fgets (str2, 100, stdin); Ich werde nicht nach der ersten Saite gefragt. Es geht direkt zum zweiten. Danke für die schnelle Antwort. – Johny

+0

Ich bin mir nicht sicher, was dein Kommentar bedeutet - funktioniert etwas nicht? –

1

Wann möchten Sie aufhören zu lesen? Bei EOF, bei einem bestimmten Charakter oder was?

Sie können

C Spiele eine Folge von Breite count Zeichen (Standard 1) eine bestimmte Anzahl von Zeichen mit% C lesen; Der nächste Zeiger muss ein Zeiger auf char sein, und es muss genug Platz für alle Zeichen vorhanden sein (keine abschließende NUL wird hinzugefügt). Der übliche Sprung des führenden Leerzeichens wird unterdrückt. Um den Leerraum zuerst zu überspringen, verwenden Sie ein explizites Leerzeichen im Format.

können Sie bestimmte Zeichen lesen (oder auf diejenigen ausgeschlossen) mit% [

[Spiele eine nicht leere Folge von Zeichen aus dem angegebenen Satz von akzeptiert Zeichen; Der nächste Zeiger muss ein Zeiger auf char, sein und es muss genug Platz für alle Zeichen in der Zeichenfolge, plus ein abschließendes NUL-Zeichen sein. Der übliche Übersprung von führenden weißen Speicherplatz wird unterdrückt. Die Zeichenfolge besteht aus Zeichen in (oder nicht in) einem bestimmten Satz; Der Satz ist definiert durch die Zeichen zwischen der offenen Klammer [Zeichen und einer nahen Klammer] Zeichen ter. Das Set schließt diese Zeichen aus, wenn das erste Zeichen nach der offenen Klammer ein Zirkumflex^ist. Um eine enge Klammer in das Set aufzunehmen, machen Sie es zum ersten Zeichen nach der offenen Klammer oder dem Zirkumflex; Jede andere Position beendet den Satz. Das Bindestrich-Zeichen - ist auch speziell; Wenn es zwischen zwei anderen Zeichen platziert wird, fügt es alle dazwischenliegenden Zeichen zum Satz hinzu. Um einen Bindestrich hinzuzufügen, machen Sie es zum letzten Zeichen vor der abschließenden Klammer . Zum Beispiel bedeutet `[^] 0-9-] 'die Menge ` `alles außer close Klammer, Null bis neun und Bindestrich' '. Die String endet mit dem Erscheinen eines Zeichens nicht in der (oder mit einem Kreis cumflex, in) gesetzt, oder wenn die Feldbreite

abläuft
+0

Ich will nur keine Leerzeichen zwischen der Zeichenfolge. Ich habe versucht scanf ("% [^ \ n]", str); aber hat auch nicht funktioniert. Danke trotzdem! – Johny

+0

Sie möchten also eine ganze Zeile lesen? –

+0

Ich denke aber das bedeutet bis zu 79 Zeichen, oder? Ich brauche eine Schnur, die größer sein kann. – Johny

2

Erstellen Sie Ihre eigene Funktion, um eine Zeile zu lesen. Hier ist, was Sie im Grunde tun müssen:

 
1. fgets into allocated (growable) memory 
2. if it was a full line you're done 
3. grow the array 
4. fgets more characters into the newly allocated memory 
5. goto 2. 

Die Umsetzung ein bisschen schwierig sein :-) kann

Sie müssen darüber nachdenken, was Sie brauchen, um Ihre Funktion zu übergeben (zumindest die Adresse das Array und seine Größe); und was die Funktion zurückgibt, wenn alles "funktioniert" oder wenn es einen Fehler gibt.Sie müssen entscheiden, was ein Fehler ist (ist eine Zeichenfolge 10Gbytes lang ohne '\ n' ein Fehler?). Sie müssen entscheiden, wie das Array wachsen soll.


bearbeiten

Eigentlich kann es eher zu fgetc besser als fgets

 
get a character 
it it EOF? DONE 
add to array (update length), possible growing it (update size) 
is it '\n'? DONE 
repeat 
1

Um Zeichenfolge mit Platz lesen können Sie wie folgt vorgehen:

char name[30],ch; 

i=1; 
while((ch=getchar())!='\n') 
{ 
name[i]=ch; 
i++; 
} 
i++; 
name[i]='\n'; 
printf("String is %s",name); 
+0

'ch' sollte' int' sein, um'EOF' von allen anderen 'char' zu unterscheiden. Wie es jetzt ist, 'while ((ch = getchar())! = '\ N')' ist eine Endlosschleife, sollte 'EOF' von' getchar() 'zurückkommen. – chux

4
char str[100]; 

Versuchen Sie, diese

scanf("%[^\n]s",str); 

oder diese

fgets(str, sizeof str, stdin)) 
+0

1) Es gibt keinen Grund für 's' in' "% [^ \ n] s" '. 2) 'scanf ("% [^ \ n] ... 'scannt nichts und speichert nichts in' str', wenn die Eingabe '" \ n "' ist. 3) 'scanf ("% [^ \ n] .. . 'schützt nicht vor großen Eingaben. 4)' scanf ("% [^ \ n] ...' lässt '\ n'' in' stdin' stehen. – chux

Verwandte Themen