J'ai un problème lors de la saisie de l'utilisateur. J'ai utilisé la fonction Je veux que les deux invites soient sur des lignes distinctes. P> Le code suivant est un exemple simple du problème: p> le résultat comme texte: p> une image: P> Pourquoi les deux invites sont-elles montrées sur la même ligne? strong> p> P> scanf code> pour obtenir l'entrée de l'utilisateur, que je pense est la cause du problème.
3 Réponses :
Comme les autres commentaires conseillent, vous ferez mieux d'utiliser % 19 [^ \ n] code>. Cependant, cela fera toujours votre problème. Cela devrait fonctionner: Program output
 clang-7 -pthread -lm -o main main.c
 ./main
1- Insert a new student.
2- Delete a student.
3- Show all students.
4- Exit.
Choose: 1
Enter your name: jimm
Enter your age: 12
Name: jimm, Age: 12
Je vous suggère de changer ceci: à ceci: p> pour ces raisons: p> La taille de la mémoire tampon que vous spécifiez sur le précédent La finale note aussi, que
scanf code> n'inclut pas le terminateur final nul code> (contrairement à fgets code>). P > li>
scanf code> laissé une nouvelle ligne dans la mémoire tampon d'entrée et les spécificateurs de format % [] code> et % c code> ne pas filtrer automatiquement (contrairement à % d code> et autres spécificateurs). Ajouter l'espace indique scanf code> pour le filtrer. P> li>
s code> ne fait pas partie du format % [] code> mais est une erreur fréquente de codeurs qui ont utilisé % s code >. p> li>
ul> scanf code> avec % [] code> n'est pas équivalent à fgets () code>, qui lit toute nouvelle ligne finale et place dans le tampon fourni. p> p>
En ce qui concerne fgets code> il fait le même problème, comment l'utiliser sans causer ce problème?
Je n'ai pas suggéré d'utiliser fgets code> mais la réponse consiste à ne pas mélanger vos méthodes d'entrée. Si vous utilisez fgets code>, utilisez-le pour chaque entrée, puis appliquez sscanf code> à la chaîne d'entrée pour extraire ses données. Il est en fait plus facile de le faire, de récupérer à partir d'une entrée non valide (telle qu'une des données alphabétiques saisies pour un numéro).
C'est le code qui devrait faire l'affaire. Veuillez consulter les commentaires contenus dans le code:
#include <stdio.h>
int main(void) {
int age = 0;
int index;
char name[20];
int ignore; // Not char as EOF is -1
// Keep repeating the menu until a valid input
do {
printf("1- Insert a new student.\n");
printf("2- Delete a student.\n");
printf("3- Show all students.\n");
printf("4- Exit.\n\nChoose: ");
while (scanf("%d", &index) != 1 || index < 1 || index > 4); // Check for a valid index
if (index == 1) { // Choice 1 chosen (maybe switch would be better?
printf("Enter your name: ");
fflush(stdout); // So it goes to the terminal
scanf(" %19[^\n]", name);
while (1) {
printf("Enter your age: ");
fflush(stdout); // So it goes to the terminal
if (scanf(" %d", &age) == 1 && age > 0) { // I.e. valid age has been read
break; // We are done with this loop
}
// Consume up to end of line
do {
ignore == fgetc(stdin);
if (ignore == EOF) { // Nothing more to be read - error as no age entered
return -1;
}
} while (ignore != '\n');
}
printf("Name: %s, Age: %d\n", name, age);
// Do not need fflush as printf contains \n at the end
return 0;
}
// ... for the other options
}