Comment utiliser un nombre de variables demandé ?

Résolu/Fermé
blutchgaming - 31 mars 2016 à 12:41
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 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 ?
A voir également:

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
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
31 mars 2016 à 18:43
à quel moment on entre les chiffres?
0
Utilisateur anonyme
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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().
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
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
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
1 avril 2016 à 13:40
@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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
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
0