2016-11-22 4 views
-4

Mein Professor hat ein Projekt zugewiesen, wo wir einen Umkehrpoliturrechner in C machen müssen (Eingabe in Postscript-Syntax). Ich arbeite gerade an einer Methode, um die Länge des Arrays von Werten zu finden, die ich eingescannt habe (via. Txt-Datei). Meine aktuelle Methode istSo finden Sie die Länge eines C-Arrays

int length(int list[]) { 
    int c = 0; 
    while(0 == 0) { 
     if(list[c] != '\0') {c++;} 
     else {break;} 
    } 
    return c; 
} 

und der Ruf nach ist es

int sizeA = length(list); 
printf("\n%d\n", sizeA); 

Es ist derzeit nur die Länge als 0 ausgibt Weiß jemand, warum das und ein Update auf diese Methode sein könnte? Danke

+1

Sie haben gerade 'strlen' für eine Liste von ganzen Zahlen umgeschrieben ... –

+2

" Ich arbeite gerade an einer Methode, um die Länge des Arrays von Werten zu finden, die ich eingescannt habe "- wenn Sie die Bis zu diesem Zeitpunkt haben Sie wahrscheinlich einen Pufferüberlauf im Code, der die Werte liest. – user2357112

+0

Liste der ganzen Zahlen mit 'list [c]! = '\ 0''check .. – Stefan

Antwort

1

Der Begriff "Länge" ist eine Art von kniffligen in C (und Low-Level-Programmierung im Allgemeinen). Wenn Sie ein Array haben, weiß der C-Compiler, wie groß er ist, und stellt dem Programmierer eine Schnittstelle zur Verfügung, um diesen Wert in Bytes zu erhalten: sizeof. Die Sache ist, Arrays werden über Zeiger in C übergeben und die Bestimmung der Größe über Zeiger ist ohne bestimmte Meta-Informationen unmöglich. Gängige Methoden zur Bestimmung der Länge eines Arrays sind

  • Hinzufügen eines Endmarkers zum Array. Das Bestimmen der Länge ist einfach eine Frage des Iterierens, bis der Endmarker gefunden ist und die Anzahl der Iterationen zurückgibt. Beachten Sie, dass dadurch der Wert des End-Markers für die Verwendung als Wert im Array nicht verfügbar ist.

  • nur die Größe des Arrays um. Nehmen Sie als Beispiel den Systemaufruf write. Neben dem Datei-Handle benötigt es einen Zeiger auf die Daten und ihre Länge. Warum seine Länge sowie? Weil der Zeiger keine Informationen über die Länge enthält. Verwenden Sie also entweder ein Terminator wie ein Null-Byte oder übergeben Sie die Länge explizit. Die frühere Idee kann aufgegeben werden, weil der Systemaufruf write generisch sein soll; und um eine Generizität zu erhalten, muss erwartet werden, dass ein Null-Byte ein möglicher Wert in dem Array ist, so dass es aus Gründen, die ich oben geäußert habe, nicht als ein Terminator verwendet werden kann.

  • Welche Sie tatsächlich am Ende verwenden, hängt vollständig vom jeweiligen Anwendungsfall ab.


    Offenbar entschied man die Terminator-Variante zu verwenden. \0 ist das Null-Byte, ein ASCII-Zeichen mit Code-Wert 0x0. Es wird häufig zum Beenden von C-Strings verwendet. strlen verwendet es, um zum Beispiel die Länge eines C-Strings zu bestimmen.
    Für int Arrays gibt es keinen solchen vordefinierten Terminator. Sie müssen also einen eigenen Terminator erstellen. Wenn Sie auf \0 entscheiden, so sei es, aber ich würde stattdessen das Literal 0x0 verwenden, weil genau gesagt, \0 ein Zeichen Literal ist und das ist nur unpassend für int s.

    Um dies tatsächlich zu implementieren, müssen Sie den Abschlusswert an jedes Array int anhängen, dessen Größe Sie auf diese Weise bestimmen möchten. Schreiben Sie dann Ihre Funktion, um die Länge eines solchen int Arrays genau wie Sie zu erhalten, d. H. Indem Sie iterieren, bis der Terminator gefunden ist.

    Verwandte Themen