2009-01-25 30 views
17

Wie analysiert man eine ganze Zahl zu string(char* || char[]) in C? Gibt es ein Äquivalent zur Integer.parseInt(String)-Methode von Java in C?Ganzzahl zu Zeichenfolge C

+0

Ich denke, Sie haben es anders herum: int Integer.parseInt (String)? –

Antwort

43

Wenn Sie eine Ganzzahl in eine Zeichenfolge konvertieren möchten, versuchen Sie die Funktion snprintf(). Wenn Sie eine Zeichenfolge in eine Ganzzahl konvertieren möchten, versuchen Sie die Funktion sscanf() oder atoi() oder atol().

+6

Wenn Sie eine Fehlerüberprüfung wünschen, wäre strtol oder strtoul besser als sscanf, atoi oder atol. –

+0

'atoi' ist veraltet, ich würde es nicht empfehlen. – jacwah

1

Die Funktion Java parseInt() analysiert eine Zeichenfolge, um eine ganze Zahl zurückzugeben. Eine äquivalente C-Funktion ist atoi(). Dies scheint jedoch nicht mit dem ersten Teil Ihrer Frage übereinzustimmen. Möchten Sie von einer Ganzzahl in eine Zeichenfolge oder von einer Zeichenfolge in eine Ganzzahl konvertieren?

1

Sie können auch Besuche die atoi() Funktion (ascii zu integer) und es ist Verwandte, atol und atoll usw.

Auch gibt Funktionen, die das Gegenteil auch tun, nämlich itoa() und co.

int x = -5; 
char buffer[50]; 
sprintf(buffer, "%d", x); 

Sie können es auch für Doppel:

14

Um einen int in einen String zu konvertieren

double d = 3.1415; 
sprintf(buffer, "%f", d); 

einen String in einen int zu konvertieren:

int x = atoi("-43"); 

See http://www.acm.uiuc.edu/webmonkeys/book/c_guide/ für die Dokumentation dieser Funktionen.

+5

Es gibt einen möglichen Pufferüberlauf in Ihrem Code, aber ich möchte nicht berechnen, wie viele Bit-Integer Sie haben müssen, damit es passiert. Verwenden Sie snprintf(). – aib

+1

Um dort einen Pufferüberlauf mit Platz für 50 Zeichen zu haben, müssen Sie 163-Bit-Ganzzahlen haben, unter der Annahme des positiven Falles und der Anwesenheit von Null-Terminierung. >>> math.log (10 ** 49) /math.log (2) 162,77447664948076 – Arafangion

10

Es klingt wie Sie eine Zeichenfolge haben und es in eine ganze Zahl konvertiert werden soll, durch die Erwähnung von parseInt zu urteilen, obwohl es nicht ganz klar von der Frage ist ...

Um dies zu tun, verwenden Sie strtol . Diese Funktion ist geringfügig komplizierter als atoi, aber im Gegenzug gibt sie eine klarere Anzeige von Fehlerbedingungen, weil sie einen Zeiger (den der Anrufer bereitstellt) mit der Adresse des ersten Zeichens füllen kann, das es durcheinander gebracht hat. Der Anrufer kann dann das beanstandete Zeichen untersuchen und entscheiden, ob die Zeichenfolge gültig war oder nicht. atoi hingegen gibt nur 0 zurück, wenn es verloren gegangen ist, was nicht immer hilfreich ist. Wenn Sie jedoch mit diesem Verhalten zufrieden sind, können Sie es auch verwenden.

Eine Beispielverwendung von strtol folgt. Die Überprüfung auf Fehler ist sehr einfach: Wenn das erste nicht erkannte Zeichen nicht die '\x0' war, die die Zeichenfolge beendet, dann wird davon ausgegangen, dass die Zeichenfolge kein gültiges int enthält.

Diese Funktion füllt * i mit der Ganzzahl und gibt 1 zurück, wenn die Zeichenfolge eine gültige Ganzzahl enthält. Andernfalls wird 0 zurückgegeben.

+0

Spaß Tatsache, die man-Seiten für atoi sagen, dass es gleichwertig ist: (int) strol (str, (char * *) NULL, 10) –

2

Dies ist discussed in Steve Summit C FAQs.

+0

Ich habe vergessen, auf diese Website zu gehen, jpekk. Danke, dass du mich daran erinnerst! – Paradius

0

Sie können sich die konforme Lösung unter this site ansehen.

0

können Sie versuchen:

int intval; 
String stringval; 
//assign a value to intval here. 
stringval = String(intval); 

, die den Trick tun sollten.

+0

Die Frage ist für C; Das wird nicht funktionieren. – iamnotmaynard

-1

Dies ist keine optimale Lösung. Dies ist meine Lösung mit mehreren Einschränkungen. Wenn Sie also nur begrenzte Ressourcen auf der Grundlage der Richtlinien Ihres Kursleiters/Ausbilders haben, könnte dies für Sie eine gute Lösung sein.

Beachten Sie auch, dass dies ein Bruchteil meines eigenen Projekts zu implementieren ist, und ich sowohl Operanden als auch Ziffern einlesen musste, also habe ich getchars verwendet. Andernfalls, wenn Sie nur ganze Zahlen sind und keine andere Art von Zeichen benötigen, mag ich mit dieser:

int k; 
while (scanf("%d", &k) == 1) 

Die Regeln waren keine spezifischen, „Advanced“ C Konzepte: keine String-Variablen, keine structs, keine Zeiger, keine Methoden nicht abgedeckt, und das einzige, was wir erlaubten, war #include

Also keine einfachen Methodenaufrufe wie atoi() verfügbar oder irgendwelche String-Variablen zu verwenden, entschied ich mich, es nur brutal zu erzwingen.

1: Zeichen mit getchar lesen (fgets wurde gesperrt). return 1 (exit status 1) wenn ein ungültiges Zeichen ist. Für Ihr Problem basierend auf parseInt in Java 1 11 13 ist gültig, aber 1 11 1a ist ungültig, so dass wir für alle Werte einen gültigen "String" haben, wenn alle Zeichen 0-9 whitespace ignorieren.

2: der ASCII-Wert eines char seines ganzzahligen Wert umrechnen (zB 48 => 0.)

3: eine variable val verwendet einen int solche zu speichern, dass für jedes Zeichen in einem "Teilstring" gibt ist eine entsprechende ganze Zahl. h. "1234" => 1234 hängt dies an ein int-Array an und setzt val zur Wiederverwendung auf 0.

Der folgende Code demonstriert diesen Algorithmus:

int main() { 
    int i, c; 
    int size = 0; 
    int arr[10]; //max number of ints yours may differ 
    int val = 0; 
    int chars[1200]; //arbitrary size to fit largest "String" 
    int len = 0; 

    //Part 1: read in valid integer chars from stdin 
    while((c = getchar()) != EOF && (c < 58 && c > 47)) { 
     chars[len] = c; 
     len++; 
    } 

    //Part 2: Convert atoi manually. concat digits of multi digit integers and 
    //  append to an int[] 
    for(i = 0; i < len; i++){ 
    for(i = 0; i < len; i++){ 
     if(chars[i] > 47 && chars[i] < 58){ 
     while((chars[i] > 47 && chars[i] < 58)){ 
      if(chars[i] == 48) 
       c = 0; 
      if(chars[i] == 49) 
       c = 1; 
      if(chars[i] == 50) 
       c = 2; 
      if(chars[i] == 51) 
       c = 3; 
      if(chars[i] == 52) 
       c = 4; 
      if(chars[i] == 53) 
       c = 5; 
      if(chars[i] == 54) 
       c = 6; 
      if(chars[i] == 55) 
       c = 7; 
      if(chars[i] ==56) 
       c = 8; 
      if(chars[i] == 57) 
       c = 9; 
      val = val*10 + c; 
      i++; 
     } 
     arr[size] = val; 
     size++; 
     if(size > 10) //we have a check to ensure size stays in bounds 
      return 1; 
     val = 0; 
     } 
     //Print: We'll make it a clean, organized "toString" representation 
     printf("["); 
     for(i = 0; i < size-1; i++){ 
      printf("%d, ", arr[i]); 
     } 
     printf("%d]", arr[i]; 

     return 0; 

Auch dies ist die Brute-Force-Methode, aber in Fällen wie bei mir, wo man nicht die Methode Konzepte Menschen beruflich oder verschiedene C99 Geräte verwenden können diese vielleicht was du suchst.