2 votes

Comment lire plusieurs entrées scanf en C en une seule ligne ? disons 200 Merck 58.9 ?

Je suis nouveau dans ce domaine, veuillez me pardonner si ma question comporte des problèmes.

Je voudrais lire un nombre entier, un tableau de caractères (disons de taille 30) et un nombre à virgule flottante en C. Comment puis-je lire tout cela en une seule ligne en C, disons 200 Merck 58.9 ? J'ai essayé d'utiliser scanf consécutivement dans ce qui suit, mais le deuxième scanf ne fonctionne pas - l'espace entre les entrées (par exemple 200 Merck 58.9) cause des problèmes.

printf("Please enter an integer, one word string, and a float in one line");

scanf("%i", &any_integer);

scanf("%29s", &any_string); // no spaces - just a one word string

scanf("%f", &any_float);

Je voudrais ensuite tester ce que l'utilisateur saisit, m'assurer que l'entier et le flottant sont positifs et ne dépassent pas 50, et dans la chaîne de caractères, ignorer tout ce qui n'est pas un caractère. Voici un début pour le nombre entier.

/* Test the input */

while(any_integer < 0 || any_integer > 50)
{
   printf("\n*** Invalid integer.\n Please enter a value between 1 and 50: 
   ");
   scanf("%i", &any_integer);

}/* end while */

while(any_float < 0)

{
   printf("\n*** Invalid float.\n Please enter a positive value: ");
   scanf("%f", &any_float);

}/* end while */

Je voudrais placer cette configuration dans une boucle infinie qui se termine par 999, mais j'ai du mal à comprendre les détails présentés ci-dessus.

1voto

chqrlie Points 17105

Le problème est que vous passez l'adresse de any_string ce qui est incorrect et peut provoquer un comportement indéfini. any_string est un pointeur vers un char array. Vous devriez écrire :

scanf("%29s", any_string); 

Pour améliorer la gestion des erreurs et le contrôle de la saisie, je vous suggère de lire la ligne avec fgets() et tenter de l'analyser avec sscanf() . Si le format est incorrect, vous pouvez recommencer avec une nouvelle ligne :

int i1;
char s1[30];
float f1;

printf("Please enter an integer, one word string, and a float in one line\n");
for (;;) {
    char buf[100];
    char c;

    if (!fgets(buf, sizeof buf, stdin)) {
        fprintf(stderr, "premature end of file\n");
        exit(1);
    }
    if (sscanf(buf, "%i%29s%f%c", &i1, s1, &f1, &c) != 4 || c != '\n') {
        printf("Invalid input, enter a new line\n");
        continue;
    }
    if (i1 < 0 || i1 > 50 || f1 < 0 || f1 > 50) {
        printf("Invalid values: must be between 0 and 50, try again\n");
        continue;
    }
    /* input values are correct */
    break;
}

1voto

Ed Heal Points 24309

Peut-être

char s[30];
int i;
float f;
while (true) {
   if (scanf(" %d%29s%f", &i, s, &f) == 3) {
      printf("%d%s%F", i, s, f);
   } else{
     // Sort out incorrect input
     // Eat up to the new line
     scanf("%*[^\n]");
     if (feof(stdin)) {
        // Do summat here - break perhaps
     }
   }
}

c'est ce dont vous avez besoin

1voto

Justas G Points 208

Vous pouvez les mettre sur une seule ligne comme ça :

scanf("%i %29s %f", &any_integer, any_string, &any_float);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X