2016-03-21 7 views
0

Ich verstehe, wie die Größe zu finden, ein String-Typ Array: auchWie kann ich die Größe eines (* char) -Arrays innerhalb einer Funktion finden?

char * shuffleStrings(string theStrings[]) 
{ 
    int sz = 0; 
    while(!theStrings[sz].empty()) 
    { 
     sz++; 
    } 
    sz--; 
    printf("sz is %d\n", sz); 
    char * shuffled = new char[sz]; 
    return shuffled; 
} 

Eine meiner Fragen in dem obigen Beispiel ist, warum muss ich um 1 die Größe zu verringern, die wahre Anzahl der Elemente zu finden im Array? Also, wenn der Code sah wie folgt aus:

char * shuffleStrings(char * theStrings[]) 
{ 
    //how can I find the size?? 
    //I tried this and got a weird continuous block of printing 
    int i = 0; 
    while(!theStrings) 
    { 
     theStrings++; 
     i++; 
    } 
    printf("sz is %d\n", i); 
    char * shuffled = new char[i]; 
    return shuffled; 
} 
+0

Was möchten Sie mit Ihrer zweiten Frage erreichen? – Elipzer

+0

Keine Ahnung, was Sie fragen, aber Ihre Funktionsparameter sind Zeiger, daher gibt es keine Möglichkeit, die Länge des Arrays zu kennen, auf das sie zeigen könnten. Sie benötigen a, um eine Länge getrennt zu übergeben, oder einen Sentinel-Wert zu verwenden, was das erste Beispiel zu tun scheint. – juanchopanza

+0

Ich habe deine Fragen beantwortet. Ich bin mir jedoch nicht sicher, was Sie mit dem Shuffle-Pointer versuchen: Es ist ein Zeichen pro String in der Tabelle und ohne Platz für einen Null-Terminator. Willst du nicht die Gesamtgröße darin die Strings mischen? Oder möchten Sie darin die Indizes der gemischten Strings speichern? Im letzten Fall sollten Sie 'Sizet_t *' anstelle von 'char *' (oder besser 'vector shufflled (i)') betrachten. – Christophe

Antwort

0

Sie sollten den Zähler nicht verringern die reale Größe, in der Faust-Schnipsel zu bekommen. Wenn Sie zwei Elemente und ein leeres Element haben, endet die Schleife mit einem Wert, der korrekt ist.

Im zweiten Ausschnitt arbeiten Sie an einem Zeiger auf einen Zeiger. Also sollte die while-Bedingung *theStrings sein (vorausgesetzt, dass ein Nullzeiger die Markierung für das Ende Ihrer Tabelle ist.

Beachten Sie, dass in beiden Fällen, wenn die Tabelle nicht die Markierung für das Ende der Tabelle halten würde, d Risiko außerhalb der Grenzen zu gehen. Warum nicht funktioniert mit vector<string>? Dann könnte man die Größe ohne Schleife bekommen, und würde die Gefahr nicht außerhalb der Grenzen gehen

0

Was Sie hier sehen, ist die „Beendigung“ -Charakter in der Zeichenfolge oder '\0'

Sie können dies besser sehen, wenn Sie ein char * -Array anstelle einer Zeichenfolge verwenden.

Hier ist ein Beispiel für einen Größenrechner, den ich gemacht habe.

int getSize(const char* s) 
{ 
    unsigned int i = 0; 
    char x = ' '; 
    while ((x = s[i++]) != '\0'); 
    return i - 1; 
} 

Wie Sie mit einem '\0' Zeichen, um das Ende der Zeichenfolge sehen kann, wird die char* beendet. Das ist der Charakter, den Sie in Ihrem Algorithmus zählen, und deshalb erhalten Sie den zusätzlichen Charakter.

Was Ihre zweite Frage angeht, scheinen Sie ein neues Array mit der Größe aller Strings erstellen zu wollen.

Um dies zu tun, könnten Sie die Länge jeder Zeichenfolge berechnen und sie dann zusammenfügen, um ein neues Array zu erstellen.

+0

Ich vermute OP nach der Größe eines Array von String, nicht eine einzige Zeichenfolge suchen. Also arbeitet er mit einem 'char **' und sucht nach einem Ende der Tabellenmarkierung (leere Zeichenfolge im ersten Abschnitt, nullptr im zweiten Abschnitt). – Christophe