2010-12-07 15 views
3

Hallo, ich übe C und ich habe ein kleines Problem mit dem folgenden Code. Zuallererst liest mein Programm einfach die Eingabe vom Benutzer und wenn es Speicher gibt, speichert es es, sonst macht es nichts.Verwenden eines Arrays mit Zeigern in C

Ich habe ein Array von Zeigern zu char namens "Linien" und ein Array von Zeichen für die temporäre Speicherung des Eingangs namens "line".

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

#define MAXWIDTH 81 
#define MAXLINES 100 

int main() 

{ 
    char* lines [MAXLINES]; 
    char line[MAXWIDTH]; 
    int i ; 
    int n ; 


Dann werde ich überprüfen, ob mein Array von Zeigern Raum hat und der Eingang ist nicht Null. Ich mache es in einer for-Schleife, um das Array zu füllen, und normalerweise sollte die for-Schleife aufhören, wenn ich nichts eintippe und einfach Enter drücke oder wenn das Array voll ist. Wenn Platz vorhanden ist, überprüfe ich, ob in dem Bereich, auf den der Zeiger zeigt, genügend Speicher vorhanden ist. Wenn das in Ordnung ist (! = NULL), kopiert das Programm die Eingabe von gets (line) in den Speicher.

for (n = 0; n < MAXLINES && gets(line) != NULL; n++)  

     { 
      if ((lines[n] = malloc(strlen(line) + 1)) == NULL) 
       exit (1); 
      strcpy(lines[n], line);        
     } 


Der Rest des Codes ist nur für die Ausgabe und Freigabe des Speichers.

for (i = 0; i < n; i++) 
     { 
      puts(lines[n-i-1]); 
      free(lines[n-i-1]); 
     } 


    return 0; 
} 


Nun ist die problemis, dass das Programm läuft ohne Fehler, aber es funktioniert nicht, wie ich will. Es ist nur Durchführung einer Infinet-Schleife, wo ich eingeben kann, solange ich will, was ich will, ohne jede Reaktion.

+0

Endlosschleife? Bedeutung Sie können mehr als 100 Zeilen hinzufügen? – EboMike

+0

Ich habe nicht getestet, ob ich 100 Zeilen eingeben kann, aber ich habe versucht, die Schleife zu verlassen, indem ich Enter drücke. – Ordo

+0

Was lässt dich denken "normalerweise sollte die for-Schleife aufhören, wenn ich nichts eintippe und einfach Enter drücke" ?? gets() gibt bei einem Fehler nur NULL zurück, es sei denn, Sie führen eine Datei in den Befehl ein. Das Terminal wird niemals EOF machen. – AlastairG

Antwort

3

Gut für den Anfang, schlage ich vor, lesen Sie die folgenden über warum sollten Sie vermeiden, gets() zu verwenden. Ich schlage vor, mit scanf() oder fgets() statt ...

http://www.gidnetwork.com/b-56.html

dann beachten Sie, dass Sie eine Schleife zu 100 nehmen Eingang tun, und erst, nachdem alle 100 ausgeben Sie. Sie müssen also 100 Zeilen eingeben, bevor Sie etwas sehen ...

+1

Danke für den Hinweis. Ich habe die Zahl auf 10 reduziert und getestet. Es funktioniert ... der Code scheint in Ordnung zu sein. Vielen Dank. – Ordo

1

Nun, wie beenden Sie Ihre Eingabe? Die Eingabe einer leeren Zeile wird nicht helfen, da die Zeile "" nicht NULL ist. Hast du versucht, Strg + Z in der Konsole zu drücken (wenn es Windows ist)?

+0

Strg + Z macht ein "^ Z" in meiner Konsole. Ich versuche die Schleife zu verlassen, indem ich eine leere Zeile eintrage. – Ordo

2

Sie suchen nicht nach einer Leerzeile.

Sie brauchen so etwas wie:

if('\0' == line[0]) 
{ 
    break; 
} 

Und Verwendung fgets() nicht gets(). Es ist sicherer. Allerdings müssen Sie dann tun:

if('\n' == line[0] || '\r' == line[0]) 
{ 
    break; 
} 
4

gets nicht NULL zurück, wenn Sie eine leere Zeile eingeben, wenn das, was Sie versucht haben, zu überprüfen. Es wird immer noch eine leere Zeichenfolge sein. Sie müssen prüfen, ob das erste Zeichen ein \0 ist, wenn Sie nach leeren Zeilen suchen möchten.

Nebenbei bemerkt, ist gets extrem unsicher, da es Ihren Puffer überläuft, wenn Ihre Leitung zu lang ist und böse Bugs verursacht. Verwenden Sie stattdessen fgets, damit Sie die Größe Ihres Puffers angeben können. (Beachten Sie, dass fgets am Ende der Zeichenfolge ein \n hinzufügt, auch wenn es sich um eine leere Zeile handelt.)