2017-05-14 5 views
2

Ich bin ziemlich neu in der Programmierung und mache gerade einen Programmierkurs in der Schule mit C. Wir bekamen eine Aufgabe und ich habe ein bisschen Schwierigkeiten mit dem ersten Teil. Wir lernen, wie man die Zeichenkettenbehandlungsbibliothek (stdlib.h) verwendet, und das Ziel der Zuweisung besteht darin, mehrere Textzeilen über die Tastatur einzugeben. Der Lehrer hat uns geraten, zweidimensionale Arrays zu verwenden, um das zu tun, aber ich bin ein bisschen festgefahren. Hier ist der Code, den ich geschrieben habe:Eingabe mehrerer Strings in C

int main(void) { 
    char string[3][SIZE]; 
    int i, j; 
    int c; 

    printf("Enter three lines of text:\n"); 

    for (i = 0; i < 3; i++) { 
     j = 0; 
     while ((j < SIZE) && (c = getchar() != '\n')) { 
      string[i][j] = c; 
      j++; 
     } 
    } 

    for (i = 0; i < 3; i++) { 
     for (j = 0; j < SIZE; j++) { 
      printf("%c", string[i][j]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 

Einige Punkte, die Ich mag würde machen ist, dass ich die getchar() Funktion Eingang ein Zeichen in einer Zeit zu erhalten, und auch die zweiten for-Schleife I bestimmt um jede Textzeile zu drucken, die in jeder Zeile des String-Arrays gespeichert ist.

Der Eingang ist jede Textzeichenfolge für drei Zeilen, zum Beispiel:

Hi my name is John.\n 
I am from the US\n 
and I'm a student. 

Hier ist, was die aktuelle Ausgabe wie folgt aussieht:

Enter three lines of text: 
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr... 

Die Ausgabe, die ich erwartet habe, ist:

Enter three lines of text:\n 
Hi my name is John.\n 
I'm from the US\n 
and am a student. 

Alle Tipps oder Ratschläge würden sehr geschätzt werden. Vielen Dank!

+0

Ist es eine Anforderung der Übung, dass Sie Charakter für Charakter arbeiten? – Schwern

+1

Ja! Deshalb habe ich die Funktion getchar() benutzt. Mein Ausbilder hat empfohlen, da wir die String-Handling-Bibliothek studieren, die wir versuchen zu verwenden, so viele wir können, unabhängig von der Angemessenheit oder Effizienz. – Sean

+0

@Sean Danke für die Klarstellung. BTW [string.h] (https://en.wikipedia.org/wiki/C_string_handling) ist die String-Handling-Bibliothek. [stdio.h] (https://en.wikipedia.org/wiki/C_file_input/output) ist die IO-Handling-Bibliothek, von der 'getchar' kommt. [stdlib.h] (http://www.tutorialspoint.com/c_standard_library/stdlib_h.htm) ist eine Art Mülldeponie. – Schwern

Antwort

1

Zuallererst lasst mich die Tatsache loben, dass du deinen Weg mit C beginnst. Das ist die solideste Sprache, die es zu lernen gilt (besser ist nur die Versammlung selbst) - du wirst ein volles Verständnis davon haben, wie die Dinge funktionieren. t get, wenn von einer Sprache gestartet wird, die auf C geschrieben ist (wie Java und Python). Aber es ist eine harte und lange Straße, die das wert ist.

Auf den Code: Es ist viel los und Sie haben eine Menge amüsanter Fehler gemacht, die verschiedene interessante Dinge jedes Mal reproduzieren würden und Maschine Sie es ausführen.

Zunächst einmal: Ihr Code Arbeit zu machen irgendwie alles, was Sie brauchen, ist Klammer hinzufügen:

while ((j < SIZE) && ((c = getchar()) != '\n')) { 

In C alles ist binär (oder integer, je nachdem, wie man es betrachtet) und Standard-Bindung an das ist rechts a op1 b op2 c op3 d .. Zuerst op3 wird ausgewertet c op3 d = r1, dann haben Sie eine op1 b op2 r1 und so weiter. Also haben Sie den Wert von getchar() mit dem Wert von '\ n' verglichen - die nicht gleich sind, also erhalten Sie TRUE (Wert 1) und speichern es in der lokalen Variable c.

Weiter Sie noch einige Probleme wegen der Art und Weise Sie Ihr Array initialisiert:

 char string[3][SIZE]; 

Was sie tut, ist einfach „intrusts“ 3 * SIZE * sizeof (char) Bytes Sie Adressraum zu einem Prozess Ding mit der Aufschrift "String". Aber das löscht nicht alle Überbleibsel der vorherigen Live (von Ihrem Programm oder sogar vorher) auf diesen Bytes, wenn es also passiert, dass SIZE in Ihrem Programm == 100 und Sie Ihre Kreditkarte in einem echten Adressspeicher gespeichert haben (RAM) zugeordnet zu dieser Region Ihres Programmspeichers Sie würden Ihre Kreditkarte sehen, wenn Sie es durch printf drucken - wenn Sie diese 300 Bytes nicht überschreiben.

Dies kann Ihnen helfen, es zu betrachten:

#include <stdlib.h> 
#include <stdio.h> 

#define SIZE 10 

int main(void) { 
    char string[3][SIZE]; 
    int i, j; 
    int c; 

    for(i = 0; i < 3; i++) 
     for(j = 0; j < SIZE; j++){ 
     string[i][j] = 0; 
     } 
    printf("Enter three lines of text:\n"); 

    for (i = 0; i < 3; i++) { 
     j = 0; 
     while ((j < SIZE) && ((c = getchar()) != '\n')) { 
      string[i][j] = c; 
      j++; 
     } 
    } 

    for (i = 0; i < 3; i++) { 
     for (j = 0; j < SIZE; j++) { 
      printf("%c", string[i][j]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 

auch bewusst sein, dass getchar() mit Eingang und Zeilenumbrüche mies verhalten - es hängt davon ab, ob Sie Puffer Eingabekonsole, bevor sie an das Programm zu senden auf eingeben (Newline) oder nicht. Mehr hier How to avoid press enter with any getchar()

1

Hinweis: Ich schrieb diese Antwort, bevor das OP klärte sie mussten getchar verwenden.

Um eine ganze Zeile gleichzeitig zu lesen, verwenden Sie fgets. Verwenden Sie printf mit dem Format %s, um eine ganze Zeichenfolge auf einmal zu drucken.

#include <stdio.h> 

int main(void) { 
    // No need to define a SIZE constant. 
    // Because it's stack allocated we can its size. 
    char strings[3][100]; 

    printf("Enter three lines of text:\n"); 

    for (int i = 0; i < 3; i++) { 
     // Reads one line, up to the size of `strings[i]`, from stdin. 
     fgets(strings[i], sizeof(strings[i]), stdin); 
    } 

    for (int i = 0; i < 3; i++) { 
     // Print each string and its line number. 
     printf("Line %d: %s\n", i, strings[i]); 
    } 

    return 0; 
} 

Dies ist nicht das beste Muster zum Lesen von Eingaben. Sie werden sehr schnell lernen, dass feste Speichergrößen und Leseeingaben nicht gut funktionieren. Für zukünftige Referenz wäre es eher so.

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    // A list to store 3 strings, but no memory for the strings themselves. 
    char *strings[3]; 

    printf("Enter three lines of text:\n"); 

    // A line buffer that's sufficiently large. 
    // This will be reused. 
    char line[4096]; 
    for (int i = 0; i < 3; i++) { 
     // Read into the large line buffer. 
     fgets(line, sizeof(line), stdin); 

     // Copy the string into a buffer that's just big enough. 
     strings[i] = strdup(line); 
    } 

    for (int i = 0; i < 3; i++) { 
     printf("Line %d: %s\n", i, strings[i]); 
    } 

    return 0; 
} 

Diese weist einen einzigen großen Zeilenpuffer das Lesen zu tun, dann kopiert, was seine Lese mit strdup zu Erinnerung an genau die richtige Größe. Auf diese Weise können Sie selbst sehr lange Eingabezeilen lesen, ohne viel Speicher zu verschwenden, wenn sie sehr kurz sind.

Beachten Sie, dass strdup() nicht Teil der C-Standardbibliothek ist, aber es ist Teil der POSIX-Spezifikation. Jeder größere Compiler wird es haben, und es ist einfach, eigene zu schreiben.