2009-11-26 17 views
8

in int Wie kann ich einen konvertieren char [0] in int b [0] wobei B eine leere dynamisch zugewiesen int Arrayeinzigen char konvertieren

I

char a[] = "4x^0"; 
int *b; 
b = new int[10]; 
char temp = a[0]; 
int temp2 = temp - 0; 
b[0] = temp2; 

versucht haben, ich will 4 aber es gibt mir ascii Wert 52

auch

a[0] = aoti(temp); 

gibt mir Fehler machen: ungültige co nversion von ‚char‘ auf ‚const char *‘ Argument initialisiert 1 von ‚int atoi (const char *)‘

+0

Beachten Sie, dass atoi nicht funktioniert, weil atoi nimmt in einer Zeichenkette und nicht einem einzigen Zeichen - aus dem sehr guten Grund, dass die meisten Zahlen mehr als eine Ziffer haben! –

Antwort

24

Sie tun müssen:

int temp2 = temp - '0'; 

statt.

+0

Vom Standpunkt eines Sprachanwalts aus kann ich mir vorstellen, dass es nicht gültig ist, anzunehmen, dass die Ziffern sequenziell sind, also nicht 100% portabel - obwohl es sowohl in ASCII (und seinen Erweiterungen) als auch in EBCDIC funktioniert fein. –

+13

Überraschenderweise ist es sogar für einen Sprachjuristen völlig in Ordnung - ISO C90 enthält die folgende unauffällige Anforderung: "In den Quell- und Ausführungsgrundzeichensätzen muss der Wert jedes Zeichens nach 0 in der obigen Liste von Dezimalziffern eins größer sein als der Wert des vorherigen ". –

+0

Sehr gut, @Pavel. Es wird viel Code geschrieben, der davon ausgeht, dass die Alphas auch zusammenhängend sind, was es zu einem königlichen PITA für das UNIX Subsystem des Mainframes macht (USS, das EBCDIC verwendet, nicht zu verwechseln mit zLinux, das ASCII verwendet). Abgesehen von dem ziemlich begrenzten minimalen Zeichensatz und der zusammenhängenden Art der numerischen Zeichen, verlangt ISO C in diesem Bereich nicht wirklich viel. – paxdiablo

1

Die atoi() - Version funktioniert nicht, da atoi() auf Strings und nicht auf einzelnen Zeichen operiert. So würde diese Arbeit:

char a[] = "4"; 
b[0] = atoi(a); 

Beachten Sie, dass Sie könnten versucht sein, zu tun: atoi (& temp) aber dies würde nicht funktionieren, da & Temperatur nicht auf einen nullterminierten String nicht zeigen.

0

Sie können die gesamte Sequenz ersetzen:

char a[] = "4x^0"; 
int *b; 
b = new int[10]; 
char temp = a[0]; 
int temp2 = temp - 0; 
b[0] = temp2; 

mit einfacher:

char a[] = "4x^0"; 
int b = new int[10]; 
b[0] = a[0] - '0'; 

Keine Notwendigkeit, auf allen Durcheinander über mit temporären Variablen. Der Grund müssen Sie '0' statt 0 verwenden, weil die erstere die Charakter ‚0‘ ist, die einen Wert von 48 hat, anstatt den Wert 0.