Comment utiliser un nombre de variables demandé ?

Résolu
blutchgaming -  
[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 ?
A voir également:

2 réponses

jisisv Messages postés 3678 Statut Modérateur 934
 
Essaye va_arg: C library macro - va_arg() par exemple.
#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




0
Utilisateur anonyme
 
à quel moment on entre les chiffres?
0
Utilisateur anonyme
 
#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
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
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().
0
[Dal] Messages postés 6373 Statut Contributeur 1 106
 
@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
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
0
Utilisateur anonyme
 
@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 ?
0
[Dal] Messages postés 6373 Statut Contributeur 1 106
 
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
0