2017-09-28 36 views
0

J'ai une liste d'entiers séparés par des espaces dans la console, de longueur n (n est lu dans la console) qui doit être divisée en entiers et placée dans un tableau de taille n. J'ai essayé ceci avec fscan et fgets, soit pour une erreur de segmentation, soit pour le verrouillage de la console et ne pas me laisser entrer dans la liste. Un conseil:Diviser l'entrée de la console c en entiers

int main() 
{ 
     int n; 
     scanf("%d", &n); 
     int buffer = n + n -1; 
     char input[buffer]; 
     //char * input; 
     //int buffer = n+n-1; 
     //fgets(input, buffer, stdin); 
     scanf("%*c", &input); 
     printf("c is %c", input[0]); 
     char * end; 
     long int l; 
     end = input; 
     int base = 10; 
     int ele = 0; 
     long int vals[n]; 
     while(l = strtol(end, &end, base)){ 
       vals[ele] = l; 
       ele += 1; 
     } 
     return 0; 
+0

try 'int tampon = n + n + 1; char * entrée = malloc (tampon); fgets (entrée, tampon, stdin), '' – BLUEPIXY

+1

scanf ("% d", &n); '->' scanf ("% d", &n); scanf ("% * c"); ' – BLUEPIXY

Répondre

0

Il y a un certain nombre de choses qui se passent dans votre code. Voici un exemple de base de la lecture d'un tableau de taille variable d'entrée standard:

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

int main() 
{ 
    int n; 
    int *xs; 

    /* read n */ 
    if (!scanf("%d", &n) || (n <= 0)) 
    { 
    fprintf(stderr, "%s\n", "invalid n: n <= 0 or n is not an integer"); 
    return 1; 
    } 

    /* allocate xs[n] */ 
    xs = (int*)malloc(n * sizeof(int)); 
    if (!xs) 
    { 
    fprintf(stderr, "failure to allocate %d integers\n", n); 
    return 1; 
    } 

    /* read xs[] */ 
    { 
    int i; 
    for (i = 0; i < n; i++) 
     if (!scanf("%d", &(xs[i]))) 
     { 
     fprintf(stderr, "%s\n", "invalid x: x is not an integer"); 
     free(xs); 
     return 1; 
     } 
    } 

    /* ... */ 

    /* print xs[] in reverse order */ 
    { 
    int i = n; 
    while (i--) 
     printf("%d ", xs[i]); 
    puts("");  // Here's your newline 
    fflush(stdout); // POSIX only mandates flush to terminal, and only by default 
    } 

    free(xs); 
} 

Cela devrait vous aider à obtenir sur la bonne voie.

[modifier] modifié selon le commentaire ci-dessous:

  • casting à (int *) n'est pas nécessaire en C, mais il:
    • déclare l'intention
    • peut être compilé avec un compilateur C++ sans erreur
  • Adde d traitement d'erreur très simple
    ("dog" refusera maintenant d'être accepté comme entrée)
  • Ajout d'une nouvelle ligne. Notez que l'utilisation de fflush() est entièrement compatible POSIX. POSIX exige uniquement que le terminal par défaut vider sur newline. Aucune nouvelle ligne → besoin de vider. Tuyauterie pour classer → s'il vous plaît rincer.
+1

Il n'y a pas besoin de lancer le retour de 'malloc', c'est inutile Voir: [** Dois-je afficher le résultat de malloc? **] (http://stackoverflow.com/q/605845/995714).Que se passerait-il si l'entrée était «1 2 3 4 chat 5 chien 6 ... 7»? Comment saurais tu? Qu'en est-il de vérifier le ** retour ** de 'scanf' et de gérer les échecs de * matching * ou * input *? Supprimer 'fflush (stdout);' et ajouter 'putchar ('\ n')' après la boucle aiderait à rendre votre programme POSIX compatible. –

0

Que votre compilateur prend en charge la longueur variable tableau extensions:

#include <stdio.h> 

int main (void) { 

    int n, tmp, ndx = 0; 
    if (scanf ("%d", &n) != 1 || n < 1) { 
     fprintf (stderr, "error: invalid input - n.\n"); 
     return 1; 
    } 
    int a[n]; 

    while (ndx < n && scanf ("%d", &tmp) == 1) { 
     a[ndx] = tmp; 
     printf ("a[%3d] : %d\n", ndx, a[ndx]); 
     ndx++; 
    } 

    return 0; 
} 

ou que vous choisissez d'allouer dynamiquement votre tableau:

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

int main (void) { 

    int n, *a, tmp, ndx = 0; 
    if (scanf ("%d", &n) != 1 || n < 1) { 
     fprintf (stderr, "error: invalid input - n.\n"); 
     return 1; 
    } 

    if (!(a = calloc (n, sizeof *a))) { /* allocate/validate */ 
     fprintf (stderr, "error: virtual memory exhausted.\n"); 
     return 1; 
    } 

    while (ndx < n && scanf ("%d", &tmp) == 1) { 
     a[ndx] = tmp; 
     printf ("a[%3d] : %d\n", ndx, a[ndx]); 
     ndx++; 
    } 

    free (a); /* don't forget to free allocated memory */ 

    return 0; 
} 

Toujours, toujours, valider toutes les entrées utilisateur (avant d'affecter la valeur de la conversion à votre tableau) scanf a un retour juste pour p urposer. Vous devez gérer correspondant ou entrée échecs d'une certaine manière.

Exemple d'entrée

$ cat dat/n_10_ints.txt 
10 
8572 
-2213 
6434 
16330 
3034 
12346 
4855 
16985 
11250 

Exemple d'utilisation/sortie

$ ./bin/readnints <dat/n_10_ints.txt 
a[ 0] : 8572 
a[ 1] : -2213 
a[ 2] : 6434 
a[ 3] : 16330 
a[ 4] : 3034 
a[ 5] : 12346 
a[ 6] : 4855 
a[ 7] : 16985 
a[ 8] : 11250 
a[ 9] : 1495 

choses regarder par-dessus et laissez-moi savoir si vous avez d'autres questions.