1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

unsigned char (feld) zu int [c++]

  • schläfer
  • 17. Dezember 2006 um 01:23
  • Unerledigt
  • schläfer
    3
    schläfer
    Mitglied
    Punkte
    70
    Beiträge
    11
    • 17. Dezember 2006 um 01:23
    • #1

    hallo,

    also ich hab nen unsigned char feld, und will diesen in einen integer umwandeln (mit oder ohne vorzeichen, das ist egal)...
    wichtig ist, dass das char feld zweistellig ist, d.h. es sind zahlen von 0-99 dabei.


    die funktion atoi habe ich schon probiert, nur leider geht die bei unsigned char nicht :frowning_face:


    hat mir jemand da nen tipp wie ich es doch hinbekomme?

  • Vevusio
    6
    Vevusio
    Mitglied
    Reaktionen
    1
    Punkte
    371
    Beiträge
    71
    • 17. Dezember 2006 um 02:11
    • #2

    äh du hast einen

    Code
    unsigned char feld;

    und willst einen integer?....

    Code
    int x = (int)feld;

    hm? -.-

    [FONT=Arial, Helvetica, sans-serif](\__/) [/FONT]
    [FONT=Arial, Helvetica, sans-serif] (='.'=) [/FONT]This is Bunny. Copy Bunny into your signature to help
    [FONT=Arial, Helvetica, sans-serif](")_(")[/FONT] him on his way to world domination.

  • schläfer
    3
    schläfer
    Mitglied
    Punkte
    70
    Beiträge
    11
    • 17. Dezember 2006 um 03:01
    • #3

    genau^^

    aber casten geht da leider net, und atoi auch net :thinking_face:

  • Florian
    4
    Florian
    Mitglied
    Punkte
    165
    Beiträge
    33
    • 17. Dezember 2006 um 07:29
    • #4

    Weil du von atoi sprichst: Meinst du mit "Feld" ein Array (unsigned char feld[2]), d.h. ein Feld mit zwei Elementen, wobei jede Stelle eine Ziffer von '0'-'9' darstellt?

    Dieser Beispielcode funktioniert bei mir z.B. ohne Probleme (mit gcc -Wall):

    C
    #include <stdlib.h>
    #include <stdio.h>
    
    
    int main(int argc, char **argv) {
            unsigned char feld[2] = {'8', '0'};
            int i = atoi((char *)feld);
            printf("%d\n", i);
            return 0;
    }
  • sauzachn
    17
    sauzachn
    Mitglied
    Reaktionen
    51
    Punkte
    3.101
    Beiträge
    606
    • 17. Dezember 2006 um 12:48
    • #5

    Florian: Sollte man das char[] nicht mit \0 abschließen, bevor man es als char* behandelt? Die Manpage von atoi spricht von der "initial portion of the string", daher funktioniert es wahrscheinlich so, wie du es gemacht hast - außer es befindet sich hinter dem Array zufällig eine Zahl im Speicher - die wird dann mitkonvertiert! Das ist aber nur eine Vermutung.

    schläfer: Bitte um ein genaues Beispiel, bevor wir hier rumraten. Was hast du schon probiert, welche Fehler sind aufgetreten?

    Dipper dipper dii dipper dii dipper dii duuu

  • MichiK
    9
    MichiK
    Mitglied
    Reaktionen
    1
    Punkte
    786
    Beiträge
    153
    • 17. Dezember 2006 um 15:35
    • #6

    unsigned char feld[3] = {'8', '0', '\0' };

    jetzt müßte es gehen

    Informatik @ TU Wien (1998 - 2005)

  • Vevusio
    6
    Vevusio
    Mitglied
    Reaktionen
    1
    Punkte
    371
    Beiträge
    71
    • 17. Dezember 2006 um 16:01
    • #7

    //edit

    ok, ja, stimmt

    Code
    unsigned char feld[] = "12";
    
    
        int feldZahl = atoi((char*)feld);
    
    
        cout << "feld ist: " << feldZahl;

    bzw wenn dein array nicht mit 0 abgeschlossen ist und du damit arbeiten musst, dann so hier:

    Code
    unsigned char feld[] = {'1', '2'};
    
    
        int feldZahl = (feld[0] - 48) + (feld[1] - 48) * 10;
    
    
        cout << "feld ist: " << feldZahl;

    und wenn die character in deinem uchar array keine chars sind also '1' sondern einfach nur 1 drin steht dann ohne das - 48 hinter jedem element

    [FONT=Arial, Helvetica, sans-serif](\__/) [/FONT]
    [FONT=Arial, Helvetica, sans-serif] (='.'=) [/FONT]This is Bunny. Copy Bunny into your signature to help
    [FONT=Arial, Helvetica, sans-serif](")_(")[/FONT] him on his way to world domination.

  • schläfer
    3
    schläfer
    Mitglied
    Punkte
    70
    Beiträge
    11
    • 17. Dezember 2006 um 16:24
    • #8

    Florian: danke dir, dass ist exakt das was ich brauche :)

    ich hab das schon so ähnlich probiert, nur eben ohne einen reinterpret cast ... war wohl etwas spät, da der compiler mir genau diese meldung gebracht hat:hewa:


    Vevusio: diese methode habe ich mir eben gegoogelt, die geht allerdings etwas anders, und ist etwas umständlich im vergleich zu atoi...

    man muss immer von vorne mit dem stellenwert multiplizieren, und immer '0' abziehen, z.b.:

    int x=((feld[0]-'0')*10) + ((feld[1]-'0')*1) oder
    int x=((feld[0]-'0')*100) + ((feld[1]-'0')*10) + ((feld[2]-'0')*1) usw.

  • Florian
    4
    Florian
    Mitglied
    Punkte
    165
    Beiträge
    33
    • 17. Dezember 2006 um 23:04
    • #9
    Zitat von sauzachn

    Florian: Sollte man das char[] nicht mit \0 abschließen, bevor man es als char* behandelt? Die Manpage von atoi spricht von der "initial portion of the string", daher funktioniert es wahrscheinlich so, wie du es gemacht hast - außer es befindet sich hinter dem Array zufällig eine Zahl im Speicher - die wird dann mitkonvertiert! Das ist aber nur eine Vermutung.

    Du hast natürlich Recht, einen String sollte man mit einem '\0'-Zeichen abschließen. Danke für den Hinweis! :winking_face:

  • schläfer
    3
    schläfer
    Mitglied
    Punkte
    70
    Beiträge
    11
    • 19. Dezember 2006 um 16:19
    • #10

    tag, ich wieder:engel:

    hab noch ne frage, und stelle sie direkt mal hier, hoffe das noch genug reinschauen:)

    also ich such ein ersatz für scanf in c++... ich will damit was beim einlesen casten, hier das bsp:

    Code
    char c;
     scanf("%i", &c);          // ich gebe 65 ein
     cout << c << endl;        // und bekomme "A" als ausgabe




    nun ist ja scanf nicht wirklich c++, wie kann ich das da verwirklichen?

    Code
    cin >> (int)c;



    funktioniert da leider net...



    €dit: also genauergesagt such ich einen ersatz für den befehl scanf, den trick mit der int temp kenne ich schon ( oder ist das die einzigste möglichkeit in c++? ):

    Code
    char c;
    int i;
    cin << i;                        // ich gebe 65 ein
    c=i;
    cout << c << endl;         // und bekomme "A" als ausgabe
  • Vevusio
    6
    Vevusio
    Mitglied
    Reaktionen
    1
    Punkte
    371
    Beiträge
    71
    • 19. Dezember 2006 um 17:16
    • #11

    äh naja... du könntest zb

    Code
    #include <cstdlib>
    
    
    ....
    
    
        const int lineLength = 80;
        char line[lineLength];
    
        cin.getline((char*)line, lineLength);
        char c = strtol(line, 0, 10);
        cout << "Char is: " << c;
    Alles anzeigen

    cstdlib brauchst du für string to long int und äh... ja, nen direkten weg das so zu machen wie du willst gibt es glaub ich nicht >.>

    [FONT=Arial, Helvetica, sans-serif](\__/) [/FONT]
    [FONT=Arial, Helvetica, sans-serif] (='.'=) [/FONT]This is Bunny. Copy Bunny into your signature to help
    [FONT=Arial, Helvetica, sans-serif](")_(")[/FONT] him on his way to world domination.

  • schläfer
    3
    schläfer
    Mitglied
    Punkte
    70
    Beiträge
    11
    • 19. Dezember 2006 um 17:55
    • #12

    nuja^^

    das ist dann noch mehr "umweg" alt mit integer variante...


    habs aber schon fast geahnt, dass es so nicht läuft ... muss halt scanf bleiben:/

  • sauzachn
    17
    sauzachn
    Mitglied
    Reaktionen
    51
    Punkte
    3.101
    Beiträge
    606
    • 19. Dezember 2006 um 19:45
    • #13

    Hm warum nicht in die andere Richtung?

    Code
    int i;
    cin >> i;
    cout << (char)i << endl;

    Dipper dipper dii dipper dii dipper dii duuu

  • schläfer
    3
    schläfer
    Mitglied
    Punkte
    70
    Beiträge
    11
    • 19. Dezember 2006 um 20:13
    • #14

    ich muss die variable so klein wie möglich wählen...

    da ich nur zahlen von -115 bis 120 habe, sollte ich wohl ne char nehmen (-127 bis 127) ...


    ich weiss eben nur nich ob scanf etwas in einem c++ code zu suchen hat...

    ich denk mal, dass c++ nicht schlechter wie c sein, also das es auch da ne möglichkeit gibt, beim einlesen zu casten...nur scheints laut google nicht so zu sein.

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 20. Dezember 2006 um 17:02
    • #15
    Zitat von schläfer

    ich denk mal, dass c++ nicht schlechter wie c sein [wird]

    Uje, da hat wohl jemand noch nicht viel Erfahrung mit C++ :)

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • J.Petso
    15
    J.Petso
    Mitglied
    Reaktionen
    14
    Punkte
    2.384
    Beiträge
    457
    • 27. Dezember 2006 um 16:13
    • #16
    Zitat von hal

    Uje, da hat wohl jemand noch nicht viel Erfahrung mit C++ :)


    Die Meinungen zu diesem Thema sind kontrovers und wurden, wie du sicher noch gut in Erinnerung hast :shinner: schon in einem anderen Thread besprochen.

    "Egbert B. Gebstadter is the Egbert B. Gebstadter of indirect self-reference." - Egbert B. Gebstadter

  • Maximilian Rupp 27. Dezember 2024 um 12:05

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung