String in Integer umwandeln , ohne ATOI



  • Ich sollte vielleicht nur einen Thread nutzen, so viel Probleme wie ich habe, ughhhh....

    Wie schon im Titel erwaehnt, sollen wir einen String umwandeln in einen Integer, aber ohne die Funktion ATOI aus der Lib zu nutzen. Meine erste Idee war mit strlen irgendwas zu basteln, das hatte unser Prof. uns als Tipp gegeben, damit konnte ich dann aber nix anfangen, also habe ich ein wenig im Netz recherchiert und dann eine Loesung gefunden die in etwa so aussieht, aber leider haengt sich die .exe immer auf ...

    /***************************************************************/
    /* Programmer: Micha Hobert                                    */
    /*                                                             */
    /* Program 4:  My ATOI                                         */
    /*                                                             */
    /* Approximate completion time:   35 minutes                   */
    /***************************************************************/
    
    #include <stdlib.h>
    
    int main( int argc, char *argv[] ) { 
    
    const char t;
    
    printf("Enter a String:");
    scanf("%s", &t);
    
    my_atoi ( t );
    
    }
    
    int my_atoi ( const char * s )
    {
    int n = 0;
    if(!s) return 0;
    while(*s)
    {
    if(*s<'0' || *s>'9')
    return 0;
    n = n * 10 + *s - '0';
    s++;
    }
    return n;
    }
    


  • Was machst du, wenn dein Prof. dich die Codezeilen erklären lässt?



  • Nunja, 90 % davon verstehe ich ja.

    Ich verstehe nur nicht warum mein Funktionsaufruf nicht klappt. my_atoi ( t );



  • Isengo schrieb:

    Ich sollte vielleicht nur einen Thread nutzen, so viel Probleme wie ich habe, ughhhh....

    Nein. Neues Thema => neuer Thread. Damit die später nach diesen Themen Suchenden nicht ein Konglomerat verschiedenster Fragen finden, sondern schlicht Eine Frage => Eine Antwort oder ein paar mehr Antworten und spätestens auf Seite 2 wird der Thread entführt und so.



  • Die Funktion hast Du prima geklaut.
    Aber der Aufruf ist komisch.

    const char t;
    

    ist ganz abwegig.
    Zu abwegig.
    Mag nicht helfen. Mag empfehlen, daß Du den Mist mit Zeichen und Strings nochmal liest.
    t ist bei Dir ein Zeichen. Da paßt sicher nicht das alles rein, was Du reinmachen willst.



  • Also ich habe mich damit jetzt nochmal genauer befasst und eine Loesung gefunden 🙂 Habe sogar noch etwas dazugefuegt um von ausssen zu beweisen das es nun ein integer ist. Wenn man 2 Strings addiert, kann man ja fuer gewoehnlich nicht einfach so addieren, bzw. kommt dann hoechstwahrscheinlich keine Zahl raus, da es ja im ASCII Code geschrieben ist ... Kann noch einer das OK geben, bzw. Tipps was ich besser machen kann ?

    /***************************************************************/ 
    /* Programmer: Micha Hobert                                    */ 
    /*                                                             */ 
    /* Program 12: MyAtoi                                          */ 
    /*                                                             */ 
    /* Approximate completion time:   45 minutes                   */ 
    /***************************************************************/ 
    
    int main( int argc, char *argv[] ) { 
    
      int n = 0;
    
      while (*argv[1]){
    
          n = n * 10 + *argv[1] - '0';
          argv[1]++;
    
         }
    
      printf("The conversion of the string number 1 to an integer is :%d\n", n);
    
      printf("To proof this, I will sum the first two strings you typed in...\n\n");
    
      int x = 0;
    
      while (*argv[2]){
    
        x = x * 10 + *argv[2] - '0';
        argv[2]++;
    
      }
    
      int result = x + n ;
    
      printf("The sum of string 1 and 2 is :%d\n", result);
    
    }
    


  • 1. Bitte richtig einrücken.
    2. Wie wär's mit: result = n + n, statt einer erneuten Konvertierung?
    3. Du prüfst nicht, ob das, was du da umwandelst, überhaupt eine Zahl ist.
    4. Vorzeichen?
    ----
    atoi() macht übrigens noch wesentlich mehr als das. Du musst noch Leerzeichen überspringen und auf nen Integer-Overflow achten. Aber das erwartet euer Professor vermutlich noch nicht.



  • Also von mir bekommt der Code eine 5 ...

    1. Es wird nicht geprüft ob überhaupt was übergeben wurde (argc)
    -> wenn argv[1] einen Nullpointer enthält stürzt es ab bei while (*argv[1])

    2. Mit argv[1]++ verliert man den Zugriff auf die ursprünglich übergebenen Werte.
    Der Zeiger wird üblicherweise kopiert.

    3. Das aufaddieren von char setzt eine bestimmte Codetabelle voraus (z.B. ASCII).
    Wenn man das schon macht (machen muss), sollte *argv[1] - '0' nicht kleiner 0 und nicht groesser als 9 werden 😉

    4. Die bereits angesprochenen Probleme Vorzeichen, Leerzeichen sowie Wertebereich
    sind immer noch völlig unberücksichtigt. (Was passiert wenn die Zahl nicht in einen int passt ?)



  • merano schrieb:

    3. Das aufaddieren von char setzt eine bestimmte Codetabelle voraus (z.B. ASCII).
    Wenn man das schon macht (machen muss), sollte *argv[1] - '0' nicht kleiner 0 und nicht groesser als 9 werden 😉

    Der Standard garantiert, dass die numerischen Werte der Zeichen '0' bis '9' aufsteigend direkt aufeinander folgen. c - '0' ist unkritisch, wenn bekannt ist, dass c eine Ziffer enthält; kritisch wäre dagegen c - 48.

    Was das Vorzeichen und führende Whitespaces angeht, so ist das leicht ranzupatchen. Ich stelle mir das etwa so vor:

    #include <ctype.h>
    
    int my_atoi(char const *s) {
      int sign = 1;
      int result = 0;
    
      /* Whitespaces überspringen */
      while(isspace(*s)) {
        ++s;
      }
    
      /* Vorzeichenverarbeitung */
      if(*s == '-') {
        sign = -1;
        ++s;
      }
    
      /* Rest (fast) wie gehabt. */
      for(; isdigit(*s); ++s) {
        result = result * 10 + sign * (*s - '0');
      }
    
      return result;
    }
    

    Ob tatsächlich eine Zahl geparst wird, prüft atoi auch nicht; ich sehe also keinen Grund, das hier zu tun. Ggf. wird halt herausgegeben, was vorn als Zahl dransteht (bzw. 0).



  • seldon schrieb:

    Ob tatsächlich eine Zahl geparst wird, prüft atoi auch nicht; ich sehe also keinen Grund, das hier zu tun. Ggf. wird halt herausgegeben, was vorn als Zahl dransteht (bzw. 0).

    Nein, aber atoi() wandelt trotzdem nur gültige Zeichen um und nicht wie oben alles bis zum '\0'.
    (Du hast übrigens das Testen auf Integer-Overflow vergessen. 😉 Edit: Falls du das überhaupt machen wolltest, sollte ja nur ein "patch" sein..)


Log in to reply