char to int in C und/oder Java

CapFuture

CapFuture

Aktives Mitglied
Thread Starter
Dabei seit
23.01.2004
Beiträge
1.812
Reaktionspunkte
1
Moin allerseits :)

Entweder bin ich dumm oder ich weiß nicht mehr weiter.

Problem(Sprachunabhängig): Hab eine Zahlenfolge als String eingelesen und erfolgreich einer Methode/Prozedur übergeben. Will jetzt einzelne characters daraus rausnehmen(konvertieren in Int) und sie mit einigen mathematischen Operatoren bearbeiten.

Problem(C): Ich hab den Char-Array übergeben, funktioniert prima. Auch strlen() gibt mir die länge des Strings an. Aber atoi(c) will net. Meckert ständig wegen fehlenden cast. Hab schon ein (int) vornedran geschmissen, hat aber nicht geholfen.

Problem(Java): String erfolgreich mit nem Bufferreader eingelesen. Mit chatAt(i) bekomm ich auch mein Zeichen. Aber ich kann das verdammte Zeichen nicht in ein int konvertieren...

Wäre nett wenn einer eine methode kennen würde... sonst muss ich (bedepperte) Methode schreiben und alle 10 Fälle abklappern...
 
Java: Integer.parseInt("<string"> da muss nix mit BufferedReader oder sowas
 
Habs schon probiert. Aber wie du ja selbst schreibst: Das Ding konvertiert einen STRING(!!!) in nen int. Bei char klappt das nicht... hab ich schon getestet... argh...
 
CapFuture schrieb:
Habs schon probiert. Aber wie du ja selbst schreibst: Das Ding konvertiert einen STRING(!!!) in nen int. Bei char klappt das nicht... hab ich schon getestet... argh...

oja, geht schon!

Integer.parseInt(""+bla.charAt(i));

lg, stessi!
 
und wegen C Code, bitte gib mal deinen Code an, dann lässt sich der Fehler leichter finden, müsst nämlich so gehen und geht bei mir auch so.

lg, stessi!
 
Naja hab das problem in c zwar schon mit ner holzhammermethode gelöst, aber ich will gern wissen ob's besser geht...

Code:
int nachDezimal(char value[], int base){
  int length = strlen(value);
  int ergebnis = 0;
  int i;
  for(i=length-1;i>=0;i--){
    int val = atoi(value[i]); // Hier passiert der mist
    //warning: passing arg 1 of `atoi' makes pointer from integer without a cast
    if(val>=base){
      return -1;
    }
    ergebnis+=val*power(base,i);
  }
  return ergebnis;
}
 
in Java sollte so etwas gehen:

Code:
String zahl = "12345";

for (int i = 0; i < zahl.length(); i++) {
    int ziffer = (int) (zahl.charAt(i) - '0');
    machIrgendwas(ziffer);
}
 
Hmm, wie ich's mir gedacht habe... Differenz der Unicodes nehmen... naja merk ich mir für's nächste Javaprogramm. Thx :)
 
@CapFuture:
schau dir die Funktion atoi nochmal genauer an.

int atoi(const char *nptr);

fällt dir was auf?
die warning sagts dir übrigens auch ganz genau.

1 ... 2 ... 3 ... Zeit ist um, jetzt sag ichs dir.

Du hast irrtümlicherweise als Argument nen Character und nicht wie von der Funktion verlangt einen Character Pointer.

Jetzt geht die Funktion natürlich her und nimmt deinen Rückgabewert als Adresse.
Da müsst einfach Schrott, wenn nicht ein Segmentation Fault oder sonstwas kommen.

lg, stessi!

P.S.: hast du meine Antwort bezüglich Java auch ausprobiert?
 
CapFuture schrieb:
Naja hab das problem in c zwar schon mit ner holzhammermethode gelöst, aber ich will gern wissen ob's besser geht...
Code:
...
    ergebnis=ergebnis * base + val;
...
Noch nebenbei bemerkt: Dieser Weg ist eleganter (flotter), weil du dir die aufwändige power-Funktion ersparst. Sie wird nebenbei berechnet, indem Stelle für Stelle "nach links" eingeschoben wird (stimmt deine Indizierung?).

Grüße,
Matthias
 
Erste vielen Dank für die vielen Antworten :)

@stessi: Deinen Javavorschlag hab ich nochnicht probiert (habs überlesen :rolleyes: )
Das es am Pointer liegt hab ich mir auch schon gedacht... nur viel mir keine produktivere Lösung ein ;)
Glaubst du es würde klappen, wenn ich atoi(&value) schreibe= ;)

@mattmiksys: Ehh ich seh nicht, das mein und dein Ausdruck das selbe machen?!? Wenn du weißt, wie man per hand eine Zahl von basis x auf die basis 10 umrechnet, wird dir der unterschied klar...

Ich mach mich mal dran den Code von der Holzhammermethode zu befreien :D

Code:
int chartoint(char c){
  switch (c){
    case '0':
      return 0;
      break;
    case '1':
      return 1;
      break;
    case '2':
      return 2;
      break;
    case '3':
      return 3;
      break;
    case '4':
      return 4;
      break;
    case '5':
      return 5;
      break;
    case '6':
      return 6;
      break;
    case '7':
      return 7;
      break;
    case '8':
      return 8;
      break;
    case '9':
      return 9;
    default:
      break;
  }
}
 
chartoint kannst du auch mit weniger code (und wahrscheinlich performanter) schreiben:

Code:
int chartoint(char c)
{
    return c - '0';
}

;)

Glaubst du es würde klappen, wenn ich atoi(&value) schreibe= ;)


Das wuerde auch nicht funktionieren weil atoi einen Nullterminierenden String erwartet und nicht nur einen Pointer auf einen Char.
 
Zuletzt bearbeitet:
CapFuture schrieb:
... das mein und dein Ausdruck das selbe machen?!? ...
Der Unterschied liegt 'nur' im Aufwand: Du rechnest doch für jede Stelle die Wertigkeit separat aus, während du die einfache Multiplikation nutzen kannst, um den Stellen polynomial ihre Wertigkeit zu geben:

a*base^3 + b*base^2 + c*base^1+d =
(((a*base + b)*base + c)*base + d

deshalb auch meine Frage, ob du richtig indizierst. Nach deiner Schleife hat die am meisten rechts stehende Ziffer die höchste Wertigkeit.
Grüße,
Matthias
 
Sag doch gleich Hornerschema... das versteht man schneller ;)
 
CapFuture schrieb:
Sag doch gleich Hornerschema... das versteht man schneller ;)
Kam gerade nicht drauf ... aber das ist es, was du wolltest, nicht wahr?
Matthias
 
muss nochmal in Ruhe drüber nachdenken, ob es sich hier anwenden lässt...
Hab im moment nicht die konzentration/lust mich mit dem kram auseinander zu setzten...
 
Fraglich ob du das Problem noch lösen musst, aber ich hab in C++ neulich das gleiche Problem gehabt: Einen Byte Stream in ein char Array einlesen und in einen Integer konvertieren.
Ich habs so gelöst:

#include <iostream>

using namespace std;

int main()
{
//Arr[0] MSB, Arr[1] LSB
char Arr[2]={0x00, 0x2C}; //Hex: 0x002C, Binär: 0000000000101100, Dezimal: 44

int arrToInt = 0;

for(int i=0; i<2; ++i)
arrToInt =(arrToInt<<8) | Arr;

cout << arrToInt;

return 0;
}

Ausgabe: 44

Für die C Variante musst du nur die Laufvariable der Schleife außerhalb der Schleife deklarieren.

Gruß

schorlehubert
 
Sehr unwahrscheinlich nach weit über 3 Jahren... Ich versteh nicht, warum man so ein Thema wieder ausgraben muss

Nun das liegt einfach daran, dass ich dieses Problem halt nicht vor drei Jahren hatte sondern erst kürzlich. Als ich über die Suchfunktion auf diesen Thread gestoßen bin und keine akzeptable Lösung vorfand habe ich mich entschlossen der Vollständigkeit halber meine Lösung zu posten.
Ich wusste nicht, dass man hier deswegen angeprangert wird. Bitte entschuldige. Sollte ich in ein paar Jahren auf einen Thread von dir stoßen werde ich mich dessen bestimmt erinnern.
Schon mal dran gedacht, dass jemand mit ähnlichen Problemen auch nach Jahren auf dieses Thema stoßen könnte?

Nicht so freundlicher Gruß

schorlehubert
 
Zuletzt bearbeitet:
hehe, hab den Thread jetzt per Zufall per google Suche gefunden.
Also also nach 4 Jahren hab ich dieses Problem schon gelöst... Aber finde es schon amüsierend nach der Zeit nochmal diesen Thread zu sehen :D
 
Zurück
Oben Unten