2017-05-19 5 views
-4

Ich weiß, das ist wahrscheinlich eine sehr Anfänger Frage, aber ich habe meinen Kopf dagegen für ein paar Stunden geschlagen. Irgendwelche Tipps würden uns freuen.Konvertieren von Char-Array zu Ints

Ich habe eine nullterminierte Zeichenfolge. Ich versuche C und strtol zu verwenden, um es in int zu konvertieren, was bis zum letzten Zeichen vor dem NULL funktioniert, das a/n ist. Ich bin mir nicht sicher, wie ich Strtol dazu bringen kann, vor diesem Charakter aufzuhören.

Conversion-Code:

char *end; 
arr[0] = strtol(temps, &end, 10); 
for(int i = 1; i < n - 1; i++){ 
    arr[i] = strtol(end, &end, 10); 
} 
arr[n] = strtol(end, NULL, 10); 

Eingang:

49 32 45 50 32 45 56 32 52 32 53 10 // ascii values 

Erwartete Ausgabe:

1 -2 -8 4 5 // character array 

Ausgang:

1 -2 -8 4 1 // int array 

Vielen Dank für Ihre Hilfe.

+0

Erklären Sie, was denken Sie, mit Ihrem Programm falsch ist. Fügen Sie eine falsche Beispielausgabe in das Programm ein. Erklären Sie, wie es erhalten wurde (Ihr Code-Fragment hat keine I/O-Funktionen.) ** NB **: Sind Sie sicher, dass Sie "end" als ersten Parameter für "strtol" übergeben wollen? – DyZ

+0

Hallo, sorry, die int-Array-Ausgabe ist die falsche Ausgabe. Es sollte eine 5 ausgeben, aber es gibt eine 1 aus. Ich denke, vielleicht verstehe ich das Argument str_end nicht gut genug, um es zu verstehen, dass es bei \ n aufhören sollte. Ich glaube, das erste Ende ist richtig. Ich denke nur, dass der letzte NULL falsch ist. Für I/O, gibt es mir das Zeichen-Array temps [] durch die Ascii-Werte Ausgabe (ich habe nicht die NULL-Terminierung aber es ist da). Ich muss es in ein int-Array konvertieren, – MushinZero

+0

Poste die Definition von 'arr []'. – chux

Antwort

0

Diese Zeile schreibt wahrscheinlich aus Feldgrenzen:

arr[n] = strtol(end, NULL, 10); 

In jedem Fall ist diese arr[n-1] sein sollte, da der letzte Index zugewiesen n-2 war. Aber die Logik kann vereinfacht werden, so dass der Code weniger anfällig für solche Fehler:

char *end; 
arr[0] = strtol(temps, &end, 10); 
for(int i = 1; i < n; i++){ 
    arr[i] = strtol(end, &end, 10); 
} 

Oder noch weiter vereinfacht:

char *end = temps; 
for(int i = 0; i < n; i++){ 
    arr[i] = strtol(end, &end, 10); 
} 
+0

Danke, ich fühle mich albern. Enthält STRTOL \ n standardmäßig als eines der Endzeichen? – MushinZero

+0

@ MushinZero-- nicht genau; ['strtol()'] (http://port70.net/~nsz/c/c11/n1570.html#7.22.1.4p2) überspringt im Wesentlichen führende Leerzeichen und versucht, bis zum ersten nicht-numerischen Wert zu konvertieren Zeichen, abhängig von der angegebenen Basis. –

+0

@ MushinZero-- es wäre genauer für mich gewesen zu sagen, dass 'strtol()' versucht, bis zum ersten Zeichen zu konvertieren, das nicht als Teil einer Zahl erkannt wird. Natürlich können '-' und' + 'Teil einer Nummer sein oder nicht; auch "x" oder "X" können Teil einer Hex-Zahl sein. 'strtol()' kann mit diesen Situationen umgehen. Wenn die Basis als '0' angegeben ist, versucht 'strtol()', den String als Integer-Konstante zu interpretieren, dh Dezimal, Oktal (0nnn ...) oder Hex (0xnnn ..., oder 0Xnnn .. .). –

Verwandte Themen