Frage

Ich habe meine eigene Version von strtok entwickelt. Nur um die Verwendung von Zeigern zu üben.

Kann jemand sieht keine Einschränkungen mit diesem oder trotzdem kann ich verbessern.

void stvstrtok(const char *source, char *dest, const char token) 
{
    /* Search for the token. */
    int i = 0;
    while(*source)
    {
        *dest++ = *source++;
        if(*source == token)
        {
            source++;
        }
    }
    *dest++ = '\0';
    }

int main(void)
{
    char *long_name = "dog,sat ,on ,the,rug,in ,front,of,the,fire";
    char buffer[sizeof(long_name)/sizeof(*long_name)];

    stvstrtok(long_name, buffer, ',');

    printf("buffer: %s\n", buffer);

   getchar();

   return 0;
}
War es hilfreich?

Lösung

Eine Randbemerkung: Das Wort ‚token‘ verwendet wird, in der Regel der Teile der Zeichenfolge zu beschreiben, die zurückgegeben werden. Trennzeichen verwendet, um die Sache zu beschreiben, die die Token trennt. So Ihren Code, um mehr klar, dass Sie sollten Token umbenennen, um dest zu Begrenzer und benennen token_dest.

Unterschiede in Ihrer Funktion und strtok:

Es gibt mehrere Unterschiede zwischen Ihrer Funktion und strtok.

  • Was ist Ihre Funktion nicht einfach ist, die Token-Separatoren entfernen
  • Sie nur Ihre Funktion aufrufen, wenn alle Teile der Zeichenfolge zu verarbeiten. Mit strtok nennen Sie es mehrmals für jeden Teil des Strings (Folgezeit mit NULL als ersten param).
  • strtok zerstört auch die Quellzeichenfolge, während der Code seinen eigenen Puffer verwendet (ich glaube, besser Sie Ihre eigenen Puffer zu verwenden, wie Sie getan haben).
  • strtok speichert die Position des nächsten Token nach jedem Anruf, wo der erste Parameter NULL ist. Diese Position wird dann für nachfolgende Anrufe verwendet. Dies ist Thread nicht sicher, obwohl und Ihre Funktion würde sicher sein fädeln.
  • strtok können mehrere verschiedene Trennzeichen verwenden, während Sie den Code nur ein verwendet.

Dass gesagt wird, werde ich Vorschläge für geben, wie eine bessere Funktion zu machen, keine Funktion, die näher an strtok Implementierung ist.

Wie Sie Ihre Funktion verbessern (nicht emulieren strtok):

Ich denke, es wäre besser, die folgenden Änderungen vorzunehmen:

  • Haben Sie Ihre Funktion Sie einfach das 'next' Token
  • Break aus der Schleife, wenn Sie * Quelle oder * Quelle == Begrenzer
  • Gibt einen Zeiger auf das erste Zeichen der Quellzeichenfolge, die das nächste Token enthält. Dieser Zeiger kann für nachfolgende Anrufe verwendet werden.

Andere Tipps

Dieser Code funktioniert nicht überhaupt wie strtok(). Was haben Sie versucht, genau das zu tun? Aber soweit Verbesserungen, hat Ihr Code einen schwerwiegenden Fehler: wenn die Länge des source durch die Anzahl der Vorkommen von token abgezogen ist größer als die Länge von dest Sie haben selbst bekamen ein sehr klassischer Stack-Überlauf , die mir scheint im Moment ein wenig ironisch. Dies wird nicht in den main passieren, die Sie verwendet haben, aber mit der Funktion an anderer Stelle gebunden ist, Sie in den Weg der Unsicherheit und der Sumpf der Verzweiflung führen.

strtok ermöglicht es Ihnen, alle Token zu durchlaufen. Es tut dies, indem angenommen wird, dass die Quellzeichenfolge ist beschreibbar und Nullen in sie bei Token Pausen einlegen. Der Zielpuffer ist ein Zeiger auf die Zeichen withing Quellenpuffer versetzt. Sie können diese Tatsache nutzen zu wissen, wann Sie das Ende + auch halten „Zustand“ zwischen den Anrufen erreicht haben.

Strtok ist keine gute Funktion zu nutzen, da sie die Quellzeichenfolge zerstört. Es ist auch nicht einspringenden.

strtok () wird einige Zustand speichern, damit Sie es mehrmals aufrufen können mehrere Token zu erhalten. Auch strtok () wird „split“ die Quellzeichenfolge, so dass Sie mehrere Ziel Saiten bekommen, jeder ist ein Zeichen.

Alle Code der Fall ist, von dem, was ich sehe, ist jede Eingabe Zeichen ignorieren, die das Token seperator entspricht, und Kopieren auf die Null-Terminierung der Quelle weiter.

edit: Zusätzlich zu berücksichtigen gibt es zwei Sequenzierungs Token-seperators: Die erste von Ihrer Funktion ignoriert wird, wird der zweite in das Ziel geschrieben werden, während strtok () eine seqeunce von 2 oder mehr Trennzeichen als einzelne definieren Trennzeichen (Mann Seite: http://man.cx/?page=strtok )

strtok zerstört die Eingabezeichenfolge mit den NUL-Zeichen, die es irgendwie feindlich machen.

Sie müssen auch den Fall von „xyz ,, pdq“ überlegen, wie viele Zeichen strtok, wenn ‚‘ aus dieser Zeichenfolge ziehen ist das Trennzeichen.

Was wollen Sie Ihre Funktion in diesem Fall zu tun?

Auch strtok (...) unterstützt mehrere Begrenzungszeichen. Schauen Sie in die Definitionen von strspn (...) und strcspn (...), wie sie verwendet werden kann, um neu zu implementieren strtok (...).

By the way, ist long_name Zeiger auf char und sizeof (long_name) ist sizeof (char *). nicht die Größe, was die long_name Punkte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top