String in Int ohne atoi/isdigit

Ich werde absolut verrückt hier, Jungs. Ich versuche schon seit über einer Stunde. Wie kann ich umwandeln einer Zeichenfolge in ein array ohne Verwendung atoi, atol, isdigit so etwas wie das?

Angenommen ich habe eine const char *str und ein int *converted_val als Parameter.

Hier ist, was ich habe:

const char *c;
    for(c = str; (*c != '\0') && isdigit(*c); ++c){
                    *converted_value = *converted_value*10 + *c - '0';
    }
    return true;

aber noch einmal, ich kann es nicht ohne isdigit. Und ich bin mir nicht sicher, wie Sie Sie zu behandeln Zeichenketten, die groß sind (zum Beispiel: „10000000000000000“)

InformationsquelleAutor Mike Henke | 2016-02-11



4 Replies
  1. 3

    Ersatz isdigit(*c) durch *c >= '0' && *c <= '9':

    const char *c;
    ....
    for( c = str; *c != '\0' && *c >= '0' && *c <= '9'; ++c) {
        *converted_value = (*c - '0') + *converted_value*10;
    }
    return true;

    Beachten Sie, dass ASCII-Zeichen '0' zu '9' werden in aufsteigender Reihenfolge.

    Beschränkt auf den Bereich der integralen Datentyp converted_value.

    • Ja! Perfekt! Irgendeine Idee, wie ich das handhaben würde großen Fällen? *str = „10000000000“?
    • Tatsächlich, konsekutivität von 0 durch 9 garantiert der standard, ASCII oder nicht. Das gleiche ist nicht gilt für a durch z.
    • Sie sind begrenzt, um die Reichweite Ihres integratl Datentyp converted_value.
    • Sie überprüfen sollten Sie für überlauf innerhalb Ihrer Bekehrung gegen INT_MAX (und INT_MIN) und den Fehler behandeln Zustand. Oder ändern Sie Ihren Typ auf langen (oder die 64-bit Typ auf Ihrem system, vielleicht int64_t). Sie müssen dann prüfen, gegen das limit für die 64-bit-Typ und den Fehler behandeln.
  2. 2
    int yetAnotherAtoi(char *str)
    {
     int res = 0; //Initialize result
    
     //Iterate through all characters of input string and
     //update result
     for (int i = 0; str[i] != '\0'; ++i) {
         if (str[i]> '9' || str[i]<'0')
             return -1; # or other error...
         res = res*10 + str[i] - '0';
     }
    
     //return result.
     return res;
    }
  3. 2

    Ändern:

    int *converted_val

    zu

    long int *converted_val

    haben mehr Platz für größere Werte. Sie sollten auch das hinzufügen von code zu überprüfen, wenn der input-string wird über Ihre output-variable.

  4. 0

    wenn Sie wollen, string auf integer ohne Funktion in Visual Studio, die Sie tun können, wie unten code:

    #include "stdafx.h"
    #include<iostream>
    #include<string>
    #include<conio.h>
    using namespace std;
    
    int main()
    {
    
        std::string str ;
        getline(cin, str);
        int a = 0;
        for (int i = 0  ; i<str.length(); i++) {
            a = (int)(str[i] - 48) + a * 10;
        }
        cout << a;
    
        _getch();
        return 0;
    }

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.