2016-03-27 31 views
2

Wie kann ich eine Zeichenkette in verschiedene Ganzzahlen konvertieren? Zum Beispiel:Wie konvertiert man char * in einen String?

char *ray = {'2','1','F',' ','2','3'}; //numbers can be any length 

Wie kann ich konvertieren diese Zeile oben in:

int num = 21; 
int num2 = 23; 

Antwort

0

Angenommen, Sie haben keine nicht-stellige Zeichen als Trennzeichen. Dann können Sie diese out- versuchen>

#include <stdio.h> 
#include<string.h> 
#define MAX 100 

int main() { 
    int a,flag=0,len,num_count=0,limit; 
    char ray[MAX]; 
    fgets(ray,MAX-1,stdin); 
    len=strlen(ray); 
    int *numbers=(int*)calloc(sizeof(int),((len/2)+1)); 
    for(a=0;a<len;a++){ 
     if(ray[a]>='0' && ray[a]<='9'){ 
      flag=1; 
      numbers[num_count]=(numbers[num_count]*10)+ray[a]-'0'; 
     } 
     else{ 
      if(flag!=0){ 
       flag=0; 
       num_count++; 
      } 
     } 
    } 
    limit=(flag==0)?num_count:num_count+1; 
    for(a=0;a<limit;a++) 
     printf("%d\n",numbers[a]); 
    free(numbers); 
    return 0; 
} 
  • Hier bin ich die gesamte Zeichenfolge Eingabe in „ray“ nehmen (Eingang kann wie „344h 54j5k45jn“ sein).
  • Für jede Zeichenfolge dieses Formats können Sie maximal die Anzahl der Decken (ray.length()) angeben. So erstellen Sie ein Integer-Array dieser Größe.
  • Wenn ich nun durch die Zeichenkette wähle, wenn ich einen fortlaufenden Block von Zahlen finde, speichere ich sie im Integer-Array, und wenn ich auf ein Trennzeichen stoße, verarbeite ich das nicht.
  • Als nächstes drucken Sie einfach das Integer-Array.

Wenn noch mehr Klarheit in Bezug auf die Logik benötigt wird, bitte sagen Sie mir.

+0

Warum die Komplexität von 'fgets' hinzufügen? Vielleicht weiß das OP noch nichts über I/O. –

+1

Ich habe fgets() anstelle des veralteten gets() verwendet, da es anfällig für Pufferüberlaufprobleme ist. – RwitamB

+0

Nein, ich meinte nur, warum überhaupt aus einer Datei lesen? Das OP tut dies nicht und weiß vielleicht noch nicht einmal über E/A. –

3

Wie kann ich eine Zeichenkette in verschiedene Ganzzahlen konvertieren?

Es gibt mehrere Möglichkeiten, Ganzzahlen aus C-Strings zu extrahieren. Die ersten zwei, die in den Sinn kommen, sind die sscanf()-Funktion und die verschiedenen String-zu-Integer-Konvertierungsfunktionen, wie beispielsweise strtol(). Zunächst jedoch müssen Sie eine tatsächliche Zeichenfolge haben:

char ray[] = {'2','1','F',' ','2','3', '\0' }; /* note the terminator */ 

oder das ist 100% entspricht dem vorherigen:

char ray[] = "21F 23"; /* terminator is implicit */ 

. Dies funktioniert auch ...

char *ray = "21F 23"; /* terminator is implicit */ 

... obwohl es nicht gleichwertig ist. Ihre Beispieldeklaration ist keine Zeichenfolge, da sie nicht abgeschlossen ist. Darüber hinaus stellen Sie einen Array-Initialisierer für eine Variable bereit, die als Zeiger deklariert wurde. Obwohl Zeiger und Arrays eine enge Beziehung haben, sind sie sehr unterschiedliche Dinge.

Da eine dieser Erklärungen für ray, könnten Sie dann tun

int num; 
int num2; 
int result = sscanf(ray, "%d%*[^0-9-]%d", &num1, &num2); 

Die sscanf() Funktion ist wie scanf(), aber es scannt aus einem String statt von der Standardeingabe. Ich nehme an, dass Sie mit dem Felddeskriptor %d zum Scannen einer optional signierten dezimalen Ganzzahl vertraut sind; Das Bit zwischen den beiden Deskriptoren %d beschreibt ein Feld, das durchsucht wird, aber keiner Variablen zugewiesen ist (*), und das aus einer Folge von einem oder mehreren Zeichen besteht, die keine Dezimalziffern oder ein Bindestrich sind. Eine scanf-basierte Lösung setzt natürlich voraus, dass Sie wissen, wie viele Zahlen in der Zeichenfolge erwartet werden (in diesem Fall zwei).

Wenn Sie nicht sicher sind, wie viele Zahlen in der Zeichenfolge enthalten sind, ist es wahrscheinlich einfacher, Ihre Lösung um strtol() zu erstellen. Diese Funktion versucht, den Anfangsteil eines Strings in einen Integer umzuwandeln, und wenn er erfolgreich ist, gibt er einen Zeiger auf den Schwanz des Strings zurück, der auf den konvertierten Teil folgt. Sie können dies verwenden, um durch die Zeichenfolge zu gehen und jede Zahl, die Sie finden, während Sie gehen, zu konvertieren.

+0

Es ist erwähnenswert, dass das Beispiel des OPs benutzt keine Null-terminierte Zeichenkette und welche Effekte das haben wird, wie 'sscanf' und' strtol'. –

+0

@CareyGregory, ja, das war es, was ich im ersten Teil meiner Antwort getan habe. Ich habe diesen Teil meiner Kommentare erweitert, um das deutlicher zu machen. –

Verwandte Themen