2017-03-04 4 views
0

Ich war scanf für alle meine Eingaben in C. Jetzt sah ich andere ähnliche Fragen über scanf() und sie schlug vor, fgets() anstelle von scanf(). Ich werde es in Zukunft tun. Im Moment scheint dieser bestimmte Teil des Codes mit scanf() nie zu funktionieren. Ich weiß, dass es eine Lösung gibt.Scannen einer Zeile von Zeichenfolgen mit Leerzeichen mit scanf

Mein Code ist:

#define LENGTH 1000 
#define WORD 100 
int main(){ 
    int i = 0; 
    char s[WORD][LENGTH]; 
    do { 
     scanf("%s", s[i]); 
     i++; 
    } 
    while (s[i][strlen(s[i])] != EOF); 
    printf("%s\n", s); 

    return 0; 
} 

Es soll etwas statt EOF in der while-Schleife sein, die für das Ende der Zeile überprüft. Das Endergebnis sollte ein Array von Wörtern in s[] sein und das Programm sollte dieses Array von Wörtern ohne Leerzeichen drucken.

+0

Ich kam 'while (scanf ("% s ", & str [strlen (str)]) == 1)'. Ich bin total neu hier. Wie Iharob Al Asimi erklärte, ist es falsch. Können Sie bitte erklären, warum diese Lösung nicht korrekt ist? oder warum kann ich es nicht in meinem Code verwenden? –

Antwort

1

Leider scanf() liest nicht das Zeichen, das Sie für das Ende der Zeile überprüfen müssen, oder zumindest "%s" als den Spezifizierer nicht verwenden.

Verwenden Sie stattdessen die folgende

char line[100]; 
if (scanf("%99[^\n]", line) == 1) { 
    fprintf(stdout, "%s\n", line); 
} 

Auf diese Weise ist es nicht in Leerzeichen zu stoppen, und es verhält sich ähnlich wie fgets(), mit der Ausnahme, dass es nicht die '\n' Zeichen liest und das könnte ein Problem sein, wenn du es nochmal anrufst.

+0

jetzt verstehe ich scanf() hat sehr begrenzte Verwendung. Gibt es eine Möglichkeit, dass mein Code die while-Schleife mit im Speicher gespeicherten String-Arrays verlassen kann? damit ich das Array s [] später im Programm verwenden kann. –

+0

Sie können den gleichen Trick für Strings verwenden, beachten Sie, dass Ihre Frage nicht danach fragt. Die einfache Lösung ist, ZÄHLEN SIE DIE WÖRTER und behalten Sie eine Variable mit diesem Wert, damit Sie sie später verwenden können. Die komplizierte Lösung ist, verwenden Sie Zeiger und fügen Sie einen "NULL" -Zeiger am Ende Ihrer Wörter-Array, dann "für (int i = 0; s [i]! = NULL; ++ i) ..." würde durchlaufen alle Wörter, dasselbe für Streicher. –

+0

Nun, ich fand eine funktionierende Lösung für scanf(): 'while (scanf ("% s ", & s [strlen (s)]) == 1); Dies wird sicherstellen, dass eine vollständige Zeile gescannt wird, bis" Enter " –

Verwandte Themen