Arrayfrage



  • Hi,

    ich habe ein array und möchte daraus die position eines bestimmten Zeichens drin haben:

    Beispiel

    char array[6] = "Hallo";
    
    unsigned int position_von_a = MyFind (array, 'a');
    

    Jetzt stellt sich mir die Frage, wie kann ich MyFind aufbauen? Bitte keine verweise auf die STL, ich möchte wissen wie das im hintergrund abläuft.



  • Ich empfehle da kein unsigned integer sondern signed integer. Denn wenn er den Buchstaben nicht findet, was soll er zurückgeben? Am besten wäre da imo -1.
    Ansonsten würd ich es so mal versuchen:

    #include <iostream.h>
    
    char array[6] = "Hallo";
    
    int MyFind (char* array, char s_char)
    {
        int n=0;
        while(*(array + n) != 0)
        {
            if (*(array+n) == s_char)
            {
                return n +1;
            }
            n++;
        }
        return -1;
    }
    
    int main()
    {
        cout<<MyFind(array, 'z');
    
        cin.get();
        return 0;
    }
    

    mfg.

    Ynnus



  • Ach ja, wichtig noch, er findet natürlich nur das erste gesuchte Zeichen. Hier in deinem String sind an der Stelle 3 und 4 2mal die gleichen Zeichen, er findet aber bei 'l' nur das 1te bei 3. 😉



  • ------------ schrieb:

    ich habe ein array und möchte daraus die position eines bestimmten Zeichens drin haben:

    Beispiel

    char array[6] = "Hallo";
    unsigned int position_von_a = MyFind (array, 'a');
    

    Solange es nur um char-Arrays geht:

    #include <cstring>
    ...
    ptrdiff_t position_von_a = strchr (array, 'a') - array;
    

    Jetzt stellt sich mir die Frage, wie kann ich MyFind aufbauen? Bitte keine verweise auf die STL, ich möchte wissen wie das im hintergrund abläuft.

    Wie das im Hintergrund abläuft? Du meinst, wie das funktioniert? Etwa so (natürlich hat jede bessere Std-Lib dafür eine ASM-optimierte Funktion 😉 ):

    const char *strchr(const char *s, int c)
    {
        while (*s != c && *s != '\0')
            ++s;
        return ((*s == c) ? s : 0);
    }
    

    Moritz



  • audacia schrieb:

    const char *strchr(const char *s, int c)
    {
        while (*(s++) != c); 
        return (s); 
    }
    

    und was passiert wenn er das zeichen nicht findet? 😃



  • const char *strchr(const char *s, int c) 
    { 
        while (*s != c && *s != '\0') 
            ++s; 
        return (s); 
    }
    

    Code lässt sich nicht compilieren und gibt kein -1 zurück wenn das Zeichen nicht enthalten ist



  • ** schrieb:

    Code lässt sich nicht compilieren

    lösch' mal alle 'const' raus. vielleicht dann



  • net schrieb:

    und was passiert wenn er das zeichen nicht findet? 😃

    Hab ich auch gerade gemerkt (drittes Edit ;).
    Wenn ein Zeichen nicht gefunden wird, gibt er (jetzt jedenfalls) einen Nullzeiger zurück; das ist laut C-Standard für die Funktion strchr korrekt.

    Moritz



  • Liegt halt daran dass strchr schon gibt...
    Naja und die Funktion funktioniert nicht da du int mit char vergleichst... Musst dich schon entscheiden oder halt darauf rücksicht nehmen.



  • ** schrieb:

    const char *strchr(const char *s, int c) 
    { 
        while (*s != c && *s != '\0') 
            ++s; 
        return (s); 
    }
    

    Code lässt sich nicht compilieren und gibt kein -1 zurück wenn das Zeichen nicht enthalten ist

    Ich habe inzwischen die Fehler in der Funktion korrigiert.
    Übrigens: Die strchr-Funktion brauchst du nicht zu kompilieren - ich gab das Beispiel nur, weil du gefragt hast, wie das funktioniert. Eine Implementation der Funktion ist in der Headerdatei cstring (oder string.h) enthalten.

    Ein Beispiel für die Anwendung:

    #include <cstring>
    #include <iostream>
    
    int main (void)
    {
        char array[] = "Hallo!";
    
        cout << strchr (array, 'a') - array << endl; // gibt 1 aus
        cout << strchr (array, 'x') - array << endl; // gibt negative Zahl aus, da Zeichen nicht vorhanden
    
        return (0);
    }
    

    Moritz



  • @audacia

    Deine Methode ist scheiße! Die gefällt mir absolut nicht! Die von Ynnus ist viel besser.



  • ---------------- schrieb:

    Die von Ynnus ist viel besser.

    kannst noch einfacher haben

    int myfind (char *a, char c)
    {
        char *b = a;
        while (*a) if (*a++ == c) return a-b-1;
        return -1;
    }
    


  • net schrieb:

    ---------------- schrieb:

    Die von Ynnus ist viel besser.

    kannst noch einfacher haben

    int myfind (char *a, char c)
    {
        char *b = a;
        while (*a) if (*a++ == c) return a-b-1;
        return -1;
    }
    

    warning C4244: 'return' : conversion from '__w64 int' to 'int', possible loss of data



  • ------------------ schrieb:

    warning C4244: 'return' : conversion from '__w64 int' to 'int', possible loss of data

    dann mach aus

    return a-b-1;
    

    das

    return (int)(a-b-1);
    

    oder schalt' den 64-bit modus aus 😉



  • Ynnus ist viel besser da der 1. parameter const ist!



  • ------------------- schrieb:

    Ynnus ist viel besser da der 1. parameter const ist!

    das ist doch piepegal. die funktion schreibt ja sowieso nicht ins array rein. guckst du: http://c2.com/cgi/wiki?ConstIsaVirus



  • ---------------- schrieb:

    @audacia

    Deine Methode ist scheiße!

    1. ist die Methode nicht von mir,
    2. ist die Methode nicht Scheiße, sondern Standard-C,
    3. wäre es schön, wenn du diese niveaulosen Verbalattacken unterlassen könntest.

    Die gefällt mir absolut nicht! Die von Ynnus ist viel besser.

    🙄 Ob sie dir gefällt, spielt keine Rolle, erzähl das dem Standardkomitee. Wenn du die von Ynnus besser findest, verwende sie! Ich habe nur deine Frage beantwortet ("ich habe ein array und möchte daraus die position eines bestimmten Zeichens drin haben"), indem ich dir eine Lösung unter Verwendung der C-Standardbibliothek beschrieben habe. Da du anscheinend noch wissen wolltest, wie das funktioniert ("Bitte keine verweise auf die STL, ich möchte wissen wie das im hintergrund abläuft"), habe ich eine mögliche Implementation der verwendeten Funktion aus der Standard C Library angehängt (die leider erst nach ein paar Edits, aber definitiv vor deinem hier zitierten Posting fehlerfrei war). Die Lösung aus der StdLib ist meist die effizientere, da, wie ich bereits erwähnte, die meisten Standardbibliotheken stark optimierte Versionen der C-String-Funktionen anbieten.

    Moritz



  • net schrieb:

    ------------------- schrieb:

    Ynnus ist viel besser da der 1. parameter const ist!

    das ist doch piepegal. die funktion schreibt ja sowieso nicht ins array rein. guckst du: http://c2.com/cgi/wiki?ConstIsaVirus

    Was hast du gegen const?



  • net == TGGC



  • Also auf const verzichten wo es nötig wäre ist ein enormer FEHLER da erstens der Benutzer der Schnittstelle wissen will ob seine Variablen verändert werden zweitens
    der Programmierer selbst keinen Scheiß machen kann...


Anmelden zum Antworten