2016-06-11 6 views
2

Frage zu konvertieren:C Programmeingabestring von Leerzeichen getrennt ints in einen int array

Ich möchte ein C-Programm machen, die eine Folge von Leerzeichen getrennt ints als Eingang (positive und negative, variable Zahl nimmt von Ziffern) und wandelt die Zeichenfolge in ein int-Array um.

Es gibt eine weitere Frage zum Lesen von Ints aus einer String-Eingabe in ein Array auf Stack Overflow, aber es funktioniert nicht für Zahlen mit einer Ziffernlänge von mehr als 1 oder negativen Zahlen.

Versuch:

#include <stdio.h> 
int main() { 
    int arr[1000], length = 0, c; 
    while ((c = getchar()) != '\n') { 
    if (c != ' ') { 
     arr[length++] = c - '0'; 
    } 
    } 
    printf("["); 
    for (int i = 0; i < length-1; i++) { 
    printf("%d,", arr[i]); 
    } 
    printf("%d]\n", arr[length-1]); 
} 

Wenn ich folgend in Terminal eingeben:

$ echo "21 7" | ./run 
$ [2,1,7] 

Dies ist das Array I erhalten: [2,1,7] anstelle von [21,7

]

Wenn ich folgendes eingeben:

$ echo "-21 7" | ./run 
$ [-3,2,1,7] 

Ich bekomme: [-3,2,1,7] statt [-21,7] was keinen Sinn ergibt.

Wenn ich jedoch ein:

$ echo "1 2 3 4 5 6 7" | ./run 
$ [1,2,3,4,5,6,7] 

Anmerkung: Ich gehe davon aus, dass der Eingang es immer eine Reihe von Leerzeichen getrennt ganzen Zahlen.

+0

Warum wird 'length' nicht auf einen Wert vor der Verwendung initialisiert? – babon

+0

Ich habe das behoben. Ich stelle fest, dass ich 'getchar' verwende, das jeweils 1 Zeichen scannt. Würde 'scanf' hier helfen? Aber das erklärt nicht, warum ich '[-3,2,1]' für '-21' bekomme. – user6005857

+0

Sie erhalten -3, weil das ASCII für '-' 3 weniger ist als das ASCII für' 0'. 'getchar()' erhält unabhängig von der Art des Zeichens nur ein Zeichen, daher behandeln Sie das Minuszeichen als Zahl. – Arc676

Antwort

3

Gesamtprogramm (angepasst von this answer by @onemasse) (muss nicht mehr ungültige Eingabe lesen Eingang zum Beenden):

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int arr[1000], length = 0, c, bytesread; 
    char input[1000]; 
    fgets(input, sizeof(input), stdin); 
    char* input1 = input; 
    while (sscanf(input1, "%d%n", &c, &bytesread) > 0) { 
     arr[length++] = c; 
     input1 += bytesread; 
    } 
    printf("["); 
    for (int i = 0; i < length-1; i++) { 
     printf("%d,", arr[i]); 
    } 
    printf("%d]\n", arr[length-1]); 
    return 0; 
} 

Vom scanf/sscanf Manpage:

Diese Funktionen geben die Anzahl der Eingabeelemente zugewiesen. Dies kann weniger sein als vorgesehen oder sogar Null im Fall eines Übereinstimmungsfehlers.

Daher, wenn der Rückgabewert 0 ist, wissen Sie, dass es nicht mehr konvertieren konnte.

Probe I/O:

$ ./parse 
1 2 3 10 11 12 -2 -3 -12 -124 
[1,2,3,10,11,12,-2,-3,-12,-124] 

HINWEIS: Ich bin derzeit nicht sicher genau, wie das funktioniert. Ich werde es mir ansehen. Wenn jemand versteht, bitte bearbeiten Sie diesen Beitrag oder hinterlassen Sie einen Kommentar.

+0

Die Magie passiert in der 'scanf()' Aufruf, es dauert ein Zeiger auf eine Char * Zeichenfolge als erster Parameter. Der zweite Parameter besagt, dass Sie eine ganze Zahl in 'c' und die Anzahl der in' bytes_read' gelesenen Bytes lesen sollten. Sie verwenden 'bytes_read', um den Zeiger' input1' zu erhöhen. Auf diese Weise ändern Sie die Position, an der Sie die nächste Ganzzahl lesen. – onemasse

4

Dies ist eine Barebone-Version (keine Fehlerprüfung, soll ein Leerzeichen nach den Zahlen gelassen werden), ich bin sicher, dass Sie von hier abholen können:

int main(void) 
{ 
    int c; 
    int i, num = 0, neg = 0; 
    while ((c = getchar()) != EOF) { 
     if (c != ' ') { 
      if (c == '-') { 
       neg = 1; 
      } else { 
       i = c - '0'; 
       num = num * 10 + i; 
      } 
     } else { 
      (neg == 1) ? num *= -1 : num; 
      printf("%d\n", num + 2); // this is just to show that you indeed get an integer and addition works 
      num = 0; 
      neg = 0; 
     } 
    } 
} 
1

Ich habe nicht viel c tun, aber hier ist mein gehen :)

#include"stdio.h" 
#include"string.h" 
#include"stdlib.h" 

#define CHUNK 1000000 

#define INT_COUNT 10000 


int main(void) { 
/*get all of the input*/ 
char temp_str[CHUNK] = ""; 
char* full_string = malloc(CHUNK * sizeof(char)); 
if (full_string == 0) { 
    printf("Memory Error\n"); 
    exit(1); 
} 
int count = 2; 
do { 
    fgets(temp_str, CHUNK, stdin); 
    strcat(full_string, temp_str); 
    full_string = realloc(full_string, count * CHUNK * sizeof(char)); 
    if (full_string == 0) { 
     printf("Memory Error\n"); 
     exit(1); 
    } 
    count++; 
} while (strlen(temp_str) == CHUNK - 1 && temp_str[CHUNK - 2] != '\n'); 

//parse the input 
char* token = strtok(full_string, " "); 

int* arr = malloc(INT_COUNT * sizeof(int)), length = 0; 
if (arr == 0) { 
    printf("Memory Error\n"); 
    exit(1); 
} 

count = 1; 

while (token != 0) { 
    arr[length] = atoi(token); 
    token = strtok(0, " "); 
    length++; 
    if (length == count * INT_COUNT) { 
     count++; 
     arr = realloc(arr, count * INT_COUNT); 
     if(arr == 0) { 
      printf("Memory Error\n"); 
      exit(1); 
     } 
    } 
} 

free(full_string); 

//print the integers 
for (int i = 0; i < length; i++) { 
    printf("%d ", arr[i]); 
    if (i % 20 == 0 && i != 0) { 
     printf("\n"); 
    } 
} 

free(arr); 

return 0; 
} 
1

Editiert ein wenig. Aber es gibt noch ein Minusproblem. Ich schaue später zurück. Wenn Sie ein wenig mit diesem optimieren, könnte es funktionieren. Sie versuchen Ihren Weg. Ich werde meins versuchen. Aber später.

#include <stdio.h> 
int main() { 
    int arr[1000]={0}, length = 0, c, i; 
    while (1) { 
    c = getchar(); 

if(c=='-') 
{ 
    //minus sign has problem yet. I ll come back once I have better soln. 
} 
else if(c==' ' || c=='\n') 
{ 
    length-=2; 
    arr[length]= arr[length]*10 + arr[length+1]; 
    length++; 
    if(c=='\n') 
    { 
     break; 
    } 
} 
else if (c != ' ') { 
    arr[length++] = c - '0'; 
    } 
} 
    printf("["); 
    for (i = 0; i < length-1; i++) { 
printf("%d,", arr[i]); 
    } 
    printf("%d]\n", arr[length-1]); 
} 
Verwandte Themen