Zeiger



  • Hallo,

    hab da ein paar Fragen zur folgenden Funktion. Die Funktion soll einen Zeiger auf das erste Vorkommen des Zeichens c in der Zeichenkette s zurück liefern oder aber NULL, falls c nicht in s enthalten ist.

    char *my_strchr(const char *s, char c)
    {
       for(int i = 0; s[i] != '\0'; i++)
          if(s[i] == c)
             return const_cast<char *>(s) + i;
       return NULL;
    }
    

    und nun die Fragen

    1.)
    muss der Funktionsparameter *s eigentlich const sein oder kann ich das auch weglassen. Falls nicht warum nicht?

    2.)
    ich verstehe die Zeile mit dem cast nicht so richtig. Was haben nochmal die spitzen Klammern zu sagen? was macht diese Zeile überhaupt. ist der cast überhaupt notwendig falls ja warum.

    3.)
    Diese Frage bezieht sich jetzt nicht auf die Funktion. Sehr oft findet man Funktionen mit Rückgabetyten wie z.B. size_t. Was hat das zu sagen?

    size_t my_strlen(const char *s)
    {
       int i;
    
       for(i = 0; s[i] != '\0'; i++);
    
       return i;
    }
    


  • muss der Funktionsparameter *s eigentlich const sein oder kann ich das auch weglassen. Falls nicht warum nicht?

    nein muss er nicht... ist nur damit innerhalb der funktion nicht am string rumgepfuscht werden kann. prinzipiell kannst du es aber auch weglassen...

    ch verstehe die Zeile mit dem cast nicht so richtig. Was haben nochmal die spitzen Klammern zu sagen? was macht diese Zeile überhaupt. ist der cast überhaupt notwendig falls ja warum.

    ist einfach ein cast in c++ das was in spitzen klammern steht heisst wohin gecastet wird und in den runden steht das was gecastet werden soll...

    Diese Frage bezieht sich jetzt nicht auf die Funktion. Sehr oft findet man Funktionen mit Rückgabetyten wie z.B. size_t. Was hat das zu sagen?

    ist der grösste nicht vorzeichenbehaftete datentyp auf der ausgeführte engine... ist meist unsigned int also meist eine 32-bit zahl die von 0 bis 2^32-1 gehen kann....


  • Mod

    char *my_strchr(const char *s, char c)
    

    diese funktion lügt. const char* impliziert, dass die funktion weder direkt noch indirekt s verändert. das kann sie aber gar nicht garantieren, wenn der rückgabetyp char* ist und der rückgabewert in den string zeigt. falls die funktion mit stringliteralen aufgerufen wird und der char* pointer zum schreiben benutzt wird, ist das verhalten undefiniert. entweder man ändert den rückgabetype auf const char* oder den parameter auf char* - alles andere ist grosser mist und kaum zu vertreten.

    muss der Funktionsparameter *s eigentlich const sein oder kann ich das auch weglassen. Falls nicht warum nicht?

    nein muss er nicht... ist nur damit innerhalb der funktion nicht am string rumgepfuscht werden kann. prinzipiell kannst du es aber auch weglassen...

    wenn er er nicht const ist, kann man die funktion u.a. nicht mit stringliteralen aufrufen. es macht schon einen unterschied. beachte das es einen unterschied zwischen

    const char*
    

    und

    char* const
    

    gibt.

    Diese Frage bezieht sich jetzt nicht auf die Funktion. Sehr oft findet man Funktionen mit Rückgabetyten wie z.B. size_t. Was hat das zu sagen?

    ist der grösste nicht vorzeichenbehaftete datentyp auf der ausgeführte engine... ist meist unsigned int also meist eine 32-bit zahl die von 0 bis 2^32-1 gehen kann....

    size_t ist der typ des sizeof operators - mit 'grössten' typen hat das nichts zu tun. offenbar kann kein array indizes haben, die nicht in ein size_t passen, deshalb ist es üblich, size_t generell zum indizieren zu nutzen.



  • wenn er er nicht const ist, kann man die funktion u.a. nicht mit stringliteralen aufrufen

    klar geht das einfach casten (ob das unschön ist lass ich mal dahingestellt 😉 )


  • Mod

    dir ist nicht aufgefallen, dass das unsinn ist ... string literale sind leider vom type char* - man bedanke sich bei der heißgeliebten C-Kompatibilität. sie zu verändern ist aber trotzdem undef. verhalten.



  • Wie wäre es mit einer Überladung?

    const char*my_strchr(const char*str, char c)
    {
      //code
    }
    char *my_strchr(char*str, char c)
    {
      return const_cast<char*>(my_strchr(const_cast<const char*>(str), c));
    }
    

    Ich glaube das Argument der Verhinderung der Codedublizierung rechtfertigt die const_casts. Es würde mich aber durchaus interessieren was andere dazu sagen.


  • Mod

    man könnte auch drauf verzichten und gleich strings verwenden 🙄


Anmelden zum Antworten