Votre question est très vague, mais il me semble que vous ne voulez pas un tableau à une dimension, mais plutôt un tableau à deux dimensions (malgré le fait que votre question affirme explicitement le contraire).
Je suggère de changer char *name[10];
en char name[10][10];
De plus, vous voudrez peut-être changer le nom de la variable du tableau 2D name
en names
, car ce nom est trompeur, car il implique qu'il ne contient qu'une seule chaîne.
De plus, vous devez commencer le compteur de boucle i
à 0
, pas à 1
, car les index de tableau sont basés sur zéro en C.
Après avoir apporté ces modifications, votre programme devrait ressembler à ceci:
#include
int main( void )
{
char names[10][10];
int i = 0, input;
printf("Combien de jours par semaine: ");
scanf("%d", &input);
do{
printf("Entrez le jour %d: ", i+1);
scanf("%s", names[i]);
i++;
}while(i < input);
//sortie souhaitée
printf("Le premier jour est: %s\n", names[0]);
printf("Le cinquième jour est: %s\n", names[4]);
return 0;
}
Ce programme a le comportement suivant:
Combien de jours par semaine: 7
Entrez le jour 1: Lundi
Entrez le jour 2: Mardi
Entrez le jour 3: Mercredi
Entrez le jour 4: Jeudi
Entrez le jour 5: Vendredi
Entrez le jour 6: Samedi
Entrez le jour 7: Dimanche
Le premier jour est: Lundi
Le cinquième jour est: Vendredi
Remarquez que le programme écrira dans le tableau en dehors des limites si l'utilisateur entre un entier plus grand que 10
ou si l'un des jours a une longueur supérieure à 9
(10
en incluant le caractère nul de terminaison).
De plus, votre programme aurait une structure plus propre si vous utilisiez une boucle for
au lieu d'une boucle while
, car cela réduit la portée du compteur de boucle.
Un autre problème est que le programme se comportera mal si l'utilisateur n'entre pas un nombre. Au lieu de cela, il devrait vérifier si la fonction scanf
a réussi, et afficher un message d'erreur s'il n'a pas réussi.
Par conséquent, il serait préférable de l'écrire de la manière suivante:
#include
#include
#define MAX_DAYS 10
//MAX_DAY_LENGTH_FORMAT_STRING, qui est utilisé par scanf,
//doit toujours être défini à un de moins que MAX_DAY_LENGTH,
//car ce dernier a également besoin de place pour le caractère nul de terminaison
#define MAX_DAY_LENGTH 10
#define MAX_DAY_LENGTH_FORMAT_STRING "%9s"
int main( void )
{
char names[MAX_DAYS][MAX_DAY_LENGTH];
int num_days;
//demander à l'utilisateur une saisie
printf( "Combien de jours par semaine: " );
//essayer de lire l'entrée
if ( scanf( "%d", &num_days ) != 1 )
{
printf( "Erreur de saisie!\n" );
exit( EXIT_FAILURE );
}
//vérifier que l'entrée est dans la plage souhaitée
if ( ! ( 1 <= num_days && num_days <= 10 ) )
{
printf( "Entrée hors de portée!\n" );
exit( EXIT_FAILURE );
}
for ( int i = 0; i < num_days; i++ )
{
int num_lu;
//demander à l'utilisateur une saisie
printf( "Entrez le jour %d: ", i+1 );
//essayer de lire l'entrée
if ( scanf( MAX_DAY_LENGTH_FORMAT_STRING "%n", names[i], &num_lu ) != 1 )
{
printf( "erreur de saisie!" );
exit( EXIT_FAILURE );
}
//vérifier si l'entrée était assez petite pour tenir dans le tampon
if ( num_lu == MAX_DAY_LENGTH && getchar() != '\n' )
{
printf( "Entrée trop longue pour tenir dans le tampon!\n" );
exit( EXIT_FAILURE );
}
}
//imprimer la saisie à l'utilisateur
printf("Le premier jour est: %s\n", names[0]);
printf("Le cinquième jour est: %s\n", names[4]);
return EXIT_SUCCESS;
}
Le programme effectuera désormais une validation appropriée de l'entrée au lieu de causer un comportement indéfini en cas d'entrée erronée:
Combien de jours par semaine: abc
Erreur de saisie!
Combien de jours par semaine: 11
Entrée hors de portée!
Combien de jours par semaine: 7
Entrez le jour 1: Lundi
Entrez le jour 2: Mardi
Entrez le jour 3: Mercredi
Entrez le jour 4: Jeudi
Entrez le jour 5: Vendredi
Entrez le jour 6: Samedi
Entrez le jour 7: Dimanche
Le premier jour est: Lundi
Le cinquième jour est: Vendredi