Comment utiliser un nombre de variables demandé ?
Résolu
blutchgaming
-
[Dal] Messages postés 6373 Statut Contributeur -
[Dal] Messages postés 6373 Statut Contributeur -
Bonjour,
Bonjour, je commence doucement la programmation en C et j'essaye de faire un programme mais il me semble trop long à faire à cause d'un petit problème.
Est il possible d'utiliser un nombre de variables entré par l'utilisateur ?
en bref si je fais scanf("%d",&nbr1) si par exemple l'utilisateur rentre 3 alors j'aimerais que cela fasse printf("Entrez les %d nombres s'il vous plait",nbr1);
scanf(" %d %d %d",&nbr2,&nbr3,&nbr4);
et si il rentre 4 alors cela rentre 4 fois %d
c'est possible ?
Bonjour, je commence doucement la programmation en C et j'essaye de faire un programme mais il me semble trop long à faire à cause d'un petit problème.
Est il possible d'utiliser un nombre de variables entré par l'utilisateur ?
en bref si je fais scanf("%d",&nbr1) si par exemple l'utilisateur rentre 3 alors j'aimerais que cela fasse printf("Entrez les %d nombres s'il vous plait",nbr1);
scanf(" %d %d %d",&nbr2,&nbr3,&nbr4);
et si il rentre 4 alors cela rentre 4 fois %d
c'est possible ?
A voir également:
- Comment utiliser un nombre de variables demandé ?
- Comment utiliser chromecast sur tv - Guide
- Nombre de jours entre deux dates excel - Guide
- Utiliser iphone comme webcam - Guide
- Comment utiliser teamviewer - Guide
- Comment utiliser wetransfer - Guide
2 réponses
Essaye va_arg: C library macro - va_arg() par exemple.
Compilation/exécution:
#include <stdlib.h> #include <stdio.h> #include <stdarg.h> int my_scan(int *res, int count, ...) { va_list ap; int j; if ( res ) { va_start(ap, count); for (j = 0; j < count; j++) { *(res +j) = va_arg(ap, int); } va_end(ap); return count; } else { return 0; } } int main( int argc, char *argv[]) { int vect[10] ; int cnt; int j; cnt = my_scan( vect, 4, 1, 2, 5, 4); for (j = 0; j < cnt; j++) { printf("%d\t", vect[j]); } putchar('\n'); return EXIT_SUCCESS; }
Compilation/exécution:
johand@bata:~/src/CCM/C$ gcc -Wall -o test_stdarg test_stdarg.c
johand@bata:~/src/CCM/C$ ./test_stdarg
1 2 5 4
Utilisateur anonyme
à quel moment on entre les chiffres?
#include <stdio.h>
int main(void){
int nb,i;
puts("Nb de variables ?");
scanf("%d",&nb);
int val[nb];
for(i = 0; i < nb ; i++){
printf("Valeur n°%d : ", i+1);
scanf("%d",&val[i]);
}
puts("Valeur saisies :");
for(i = 0; i < nb ; i++) printf("%d ",val[i]);
return 0;
}
$./val
Nb de variables ?
5
Valeur n°1 : 12
Valeur n°2 : 48
Valeur n°3 : 100
Valeur n°4 : -45
Valeur n°5 : 1
Valeur saisies :
12 48 100 -45 1
Si tu tiens vraiment à entrer tous les nombres sur une ligne tu peux demande à l'utilisateur d'entrer une chaine de caractère puis la parser pour récuperer les nombres
@Rocailleux:
Si tu tiens vraiment à entrer tous les nombres sur une ligne tu peux demande à l'utilisateur d'entrer une chaine de caractère puis la parser pour récuperer les nombres
si les nombres sont séparés par des espaces, il suffit de boucler scanf autant de fois que nécessaire, et c'est
Dal
Si tu tiens vraiment à entrer tous les nombres sur une ligne tu peux demande à l'utilisateur d'entrer une chaine de caractère puis la parser pour récuperer les nombres
si les nombres sont séparés par des espaces, il suffit de boucler scanf autant de fois que nécessaire, et c'est
scanf()qui parse
stdin:-)
printf("veuillez saisir les %d valeurs séparées " "par un espace : ", nb); int i = 0; while (i < nb) scanf("%d",&val[i++]);
Dal
@fiddy oui j'ai pensé la même chose, au début j'avais mis un #define avec une taille maximale pour le tableau, ce qui gache aussi de la mémoire. Comme l'auteur a dit "je commence doucement la programmation en C" je pense pas qu'il m'en voudra pour ça, j'ai donné une solution "qui marche" même si pas très beau.
@[dal] exact... petite question : pourquoi ne faut-il pas mettre scanf("%d ",...) avec un espace dans le format ? pourquoi l'espace passe à la trappe ?
@[dal] exact... petite question : pourquoi ne faut-il pas mettre scanf("%d ",...) avec un espace dans le format ? pourquoi l'espace passe à la trappe ?
parce que le standard prévoit pour les fonctions de la famille fscanf() qu'en principe "Input white-space characters (as specified by the isspace function) are skipped" (sauf spécificateurs particuliers), et que pour le spécificateur %d un espace n'est pas un caractère capturé en tant que nombre.
donc, avec seulement "%d", après avoir capturé le premier nombre dans stdin scanf s'arrête et ne consomme pas le(s) espace(s) qui suivent, le prochain scanf passe les espaces à la recherche du prochain nombre disponible, et ainsi de suite.
si tu mets "%d ", les espaces sont consommés après capture de l'entier, s'ils existent, et ce à chaque itération. Le fonctionnement est équivalent, mais la consommation des caractères blancs se fait avant.
sinon, pour bien faire, il faudrait vérifier que la capture se passe bien pour chaque itération, histoire de vérifier que l'utilisateur a bien tapé le nombre d'entiers demandés comme on lui demande.
Dal
donc, avec seulement "%d", après avoir capturé le premier nombre dans stdin scanf s'arrête et ne consomme pas le(s) espace(s) qui suivent, le prochain scanf passe les espaces à la recherche du prochain nombre disponible, et ainsi de suite.
si tu mets "%d ", les espaces sont consommés après capture de l'entier, s'ils existent, et ce à chaque itération. Le fonctionnement est équivalent, mais la consommation des caractères blancs se fait avant.
sinon, pour bien faire, il faudrait vérifier que la capture se passe bien pour chaque itération, histoire de vérifier que l'utilisateur a bien tapé le nombre d'entiers demandés comme on lui demande.
Dal