Gibt es eine Funktion in c, die den Index eines Zeichens in einem Zeichenarray zurückgibt?

Lesezeit: 4 Minuten

Benutzer-Avatar
Josh Curren

Gibt es eine Funktion in c, die den Index eines Zeichens in einem Zeichenarray zurückgibt?

Zum Beispiel so etwas wie:

char values[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char find = 'E';

int index = findIndexOf( values, find );

  • strchr()

    – Chaos

    25. September 2009 um 20:21 Uhr

  • mögliches Duplikat der String.indexOf-Funktion in C

    – Ciro Santilli OurBigBook.com

    29. Juli 2015 um 13:52 Uhr

strchr gibt den Zeiger auf das erste Vorkommen zurück, um also den Index zu finden, nehmen Sie einfach den Offset mit dem Startzeiger. Zum Beispiel:

char values[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char find = 'E';

const char *ptr = strchr(values, find);
if(ptr) {
   int index = ptr - values;
   // do something
}

  • meine frage, wie finde ich Indizes in einem Zeichen. Wenn ich 2 hätte E s in der Zeichenfolge?

    – Turmuka

    16. Oktober 2017 um 23:07 Uhr


  • Du hast mir nicht gesagt, was ich tun soll #include

    – Strg-Alt-Entf

    28. Februar 2020 um 23:39 Uhr

  • @turmuka dann wird nur das erste Vorkommen zurückgegeben

    – Ratul Hasan

    9. Oktober 2020 um 12:17 Uhr


Es gibt auch size_t strcspn(const char *str, const char *set); es gibt den Index des ersten Vorkommens des Zeichens in zurück s das gehört dazu set:

size_t index = strcspn(values, "E");

int index = strchr(values,find)-values;

Beachten Sie, dass, wenn es keine gibt find dann gefunden strchr kehrt zurück NULLalso wird der Index negativ sein.

  • Zeigerarithmetik ein NULL ist undefiniertes Verhalten. Es muss keinen bestimmten Wert zurückgeben.

    – Konrad Borowski

    20. Dezember 2013 um 8:20 Uhr

  • Stimmt, muss nicht, tut es aber meistens :). Mein Punkt war, dass man hier einen NULL-Zeiger erwarten sollte.

    – Michael Krelin – Hacker

    20. Dezember 2013 um 14:05 Uhr

  • Nur weil es bei Ihnen zu funktionieren scheint, heißt das noch lange nicht, dass es richtig ist. Ihr Code kann zufällig fehlschlagen, wenn der Zeiger hoch genug ist (ich habe das tatsächlich überprüft, siehe gist.github.com/GlitchMr/8056175 (sollte eine Endlosschleife sein, wenn dies korrekt funktionieren würde)).

    – Konrad Borowski

    20. Dezember 2013 um 15:21 Uhr

  • Ich habe nicht gesagt, dass es richtig ist. Und ja, das ist sehr richtig, worauf Sie hinweisen, aber nur weil das Verhalten de facto definiert ist, können Sie das tun;)

    – Michael Krelin – Hacker

    20. Dezember 2013 um 18:48 Uhr

Sicher index_of() Funktion, die auch dann funktioniert, wenn sie nichts findet (returns -1 in diesem Fall).

#include <stddef.h>
#include <string.h>
ptrdiff_t index_of(const char *string, char search) {
    const char *moved_string = strchr(string, search);
    /* If not null, return the difference. */
    if (moved_string) {
        return moved_string - string;
    }
    /* Character not found. */
    return -1;
}

Was ist mit Strpos?

#include <string.h>

int index;
...
index = strpos(values, find);

Beachten Sie, dass strpos eine nullterminierte Zeichenfolge erwartet, was bedeutet, dass Sie am Ende ein ‘\0’ hinzufügen sollten. Wenn Sie das nicht können, bleibt Ihnen eine manuelle Schleife und Suche.

  • Ich glaube nicht, dass das in der C-Standardbibliothek existiert, obwohl ich mich irren könnte.

    – Ed S.

    25. September 2009 um 20:27 Uhr

  • Persönlich habe ich mehr Vertrauen in die strchr-Antworten, ich möchte wirklich, dass stattdessen eine davon als Antwort markiert wird. Ich habe nur ein wirklich altes Stück Quellcode gefunden, das diese Funktion verwendet, und ich weiß nicht, wie Standard es ist, wenn ich es betrachte.

    – Lasse V. Karlsen

    25. September 2009 um 20:29 Uhr

  • strpos() ist keine Standardfunktion in C (oder sogar C++). Ziemlich üblich in PHP usw. …

    – Jesus

    25. September 2009 um 20:29 Uhr

  • Seltsam, aber ich habe ein Stück C-Code, der es verwendet. Aber wie gesagt, ich weiß nicht, wie Standard es ist.

    – Lasse V. Karlsen

    25. September 2009 um 20:30 Uhr

  • strpos ist nicht Teil der C std lib – aber es ist wahrscheinlich auf den meisten Systemen vorhanden.

    – Martin Beckett

    25. September 2009 um 20:30 Uhr

Benutzer-Avatar
Mondasteroid

Sie können verwenden strcspn() um den Index eines Zeichens in einer Zeichenfolge zu erhalten, oder verwenden Sie meine miese Implementierung:

// Returns the index of the first occurrence of a char
int string_indexof(char ch, char *everything) {
    int everythingLength = strlen(everything);
    for (int i = 0; i < everythingLength; i++) {
        if (ch == everything[i]) {
            return i;
        }
    }

    return -1;
}

  • Ich glaube nicht, dass das in der C-Standardbibliothek existiert, obwohl ich mich irren könnte.

    – Ed S.

    25. September 2009 um 20:27 Uhr

  • Persönlich habe ich mehr Vertrauen in die strchr-Antworten, ich möchte wirklich, dass stattdessen eine davon als Antwort markiert wird. Ich habe nur ein wirklich altes Stück Quellcode gefunden, das diese Funktion verwendet, und ich weiß nicht, wie Standard es ist, wenn ich es betrachte.

    – Lasse V. Karlsen

    25. September 2009 um 20:29 Uhr

  • strpos() ist keine Standardfunktion in C (oder sogar C++). Ziemlich üblich in PHP usw. …

    – Jesus

    25. September 2009 um 20:29 Uhr

  • Seltsam, aber ich habe ein Stück C-Code, der es verwendet. Aber wie gesagt, ich weiß nicht, wie Standard es ist.

    – Lasse V. Karlsen

    25. September 2009 um 20:30 Uhr

  • strpos ist nicht Teil der C std lib – aber es ist wahrscheinlich auf den meisten Systemen vorhanden.

    – Martin Beckett

    25. September 2009 um 20:30 Uhr

Benutzer-Avatar
Ed S.

Sie können verwenden strchr um einen Zeiger auf das erste Vorkommen zu erhalten und das (wenn nicht null) vom ursprünglichen char* zu subtrahieren, um die Position zu erhalten.

1361810cookie-checkGibt es eine Funktion in c, die den Index eines Zeichens in einem Zeichenarray zurückgibt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy