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 }