Comment utiliser un nombre de variables demandé ?
Résolu/Fermé
blutchgaming
-
31 mars 2016 à 12:41
[Dal] Messages postés 6204 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 27 février 2025 - 1 avril 2016 à 14:27
[Dal] Messages postés 6204 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 27 février 2025 - 1 avril 2016 à 14:27
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 - Guide
- Comment utiliser l'ia - Accueil - Guide Intelligence artificielle
- Comment utiliser utorrent - Télécharger - Téléchargement & Transfert
- Utiliser iphone comme webcam - Guide
- Comment utiliser wetransfer gratuit ? - Guide
2 réponses
jisisv
Messages postés
3645
Date d'inscription
dimanche 18 mars 2001
Statut
Modérateur
Dernière intervention
15 janvier 2017
934
31 mars 2016 à 16:54
31 mars 2016 à 16:54
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
31 mars 2016 à 18:42
31 mars 2016 à 18:42
#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
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
31 mars 2016 à 23:51
31 mars 2016 à 23:51
Bonjour,
int val[nb];
Pas terrible le tableau à longueur variable... Il vaut mieux utiliser malloc().
N'oubliez pas non plus de flusher le buffer écran avant la fin du programme. Par exemple en mettant un '\n' dans le dernier printf().
int val[nb];
Pas terrible le tableau à longueur variable... Il vaut mieux utiliser malloc().
N'oubliez pas non plus de flusher le buffer écran avant la fin du programme. Par exemple en mettant un '\n' dans le dernier printf().
[Dal]
Messages postés
6204
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
27 février 2025
1 102
Modifié par [Dal] le 1/04/2016 à 11:56
Modifié par [Dal] le 1/04/2016 à 11:56
@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 ?
[Dal]
Messages postés
6204
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
27 février 2025
1 102
1 avril 2016 à 14:27
1 avril 2016 à 14:27
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
31 mars 2016 à 18:43