Je veux faire un code dans lequel le nom de l'utilisateur sera invité à entrer, mais dans une limite de temps de 15 secondes. Si l'utilisateur franchit la limite et n'a pas réussi à saisir un nom (ou une chaîne de chaîne), le code sera terminé et «Time Out» sera affichage auquel le nom doit être enregistré et «Merci», le massage sera affiché. J'avais essayé comme ça, mais c'est faux et ne fonctionne pas. S'il vous plaît donnez-moi une solution pour cela .. Merci.
3 Réponses :
Au lieu de cela, je construirais une fonction d'entrée spécifique autour de scanf () code> n'est pas la meilleure fonction pour obtenir une entrée dans un délai limité. P>
SELECT () CODE> (pour gérer le délai d'attente) et lisez () code> (pour obtenir une entrée) Appels système. P>
Merci Mouviciel, pouvez-vous me donner la syntaxe de Select (), avec un exemple d'exemple?
Une chose que vous devez penser, c'est que vous avez un seul fil d'exécution dans votre programme. En tant que tel, la fonction code> code> ne sera appelée que lorsque la fonction Un moyen de faire cette tâche, est d'utiliser la fonction scanf code> sera terminée. Ce n'est pas ce que vous voulez. P>
SELECT CODE>. Il attend une quantité de temps potentiellement limitée (votre délai d'attente) pour la disponibilité de l'entrée sur certains descripteurs de fichier ( stdin code> pour vous). P>
Probablement ce programme factice pourrait vous aider:
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#define WAIT 3
int main ()
{
char name[20] = {0}; // in case of single character input
fd_set input_set;
struct timeval timeout;
int ready_for_reading = 0;
int read_bytes = 0;
/* Empty the FD Set */
FD_ZERO(&input_set );
/* Listen to the input descriptor */
FD_SET(STDIN_FILENO, &input_set);
/* Waiting for some seconds */
timeout.tv_sec = WAIT; // WAIT seconds
timeout.tv_usec = 0; // 0 milliseconds
/* Invitation for the user to write something */
printf("Enter Username: (in %d seconds)\n", WAIT);
printf("Time start now!!!\n");
/* Listening for input stream for any activity */
ready_for_reading = select(1, &input_set, NULL, NULL, &timeout);
/* Here, first parameter is number of FDs in the set,
* second is our FD set for reading,
* third is the FD set in which any write activity needs to updated,
* which is not required in this case.
* Fourth is timeout
*/
if (ready_for_reading == -1) {
/* Some error has occured in input */
printf("Unable to read your input\n");
return -1;
}
if (ready_for_reading) {
read_bytes = read(0, name, 19);
if(name[read_bytes-1]=='\n'){
--read_bytes;
name[read_bytes]='\0';
}
if(read_bytes==0){
printf("You just hit enter\n");
} else {
printf("Read, %d bytes from input : %s \n", read_bytes, name);
}
} else {
printf(" %d Seconds are over - no data input \n", WAIT);
}
return 0;
}
À propos, votre ScanF ne fonctionne pas car il s'agit d'un appel de lecture de blocage sur le flux d'entrée.
Merci beaucoup shrey. Voly ce code est très utile pour moi. Parce que j'ai beaucoup d'exemples de sélection () d'Internet, mais ceux-ci étaient très complexes. Ce code est très facile à comprendre et à faire mon travail. Merci 4 votre aide.
Shrey, je remarque que si je retirais \ n à partir de l'instruction Printf, il prend d'abord la fonction Lecture (), puis imprimez le massage de l'instruction Printf (). Quelle devrait être la raison de ça ??
La fonction Lecture () donne également des caractères à déchets en sortie.
@Heet, lu renvoie des ordures car il n'y a pas \ 0 fins de ligne pour ce qui est imprimé. Ainsi, Printf de lecture Essayerait d'écrire tous les 19 caractères même s'ils ne tiennent pas les caractères d'entrée.
@Heet comme pour le commentaire précédent, concernant la lecture avant Printf, c'est-à-dire en raison de la mise en mémoire tampon de ligne. \ n obligerait la sortie sur le terminal (autant que je puisse dire). Probablement, à l'aide d'un appel de chasse (avant lecture) assurerait que tout est à l'écran avant que la lecture soit exécutée.
Pas besoin de rinçage (), Printf est tamponné et une nouvelle ligne est suffisante pour affleurer ce tampon pour sortir du flux.
int Sélection (int NFDS, fd_set * réadaptfs, fd_set * Writefds, fd_set * sauffds, struct Timeval * Timeout); Code> J'ai oublié de modifier la signification et la numérotation des paramètres de sélection ()
Suggérez en utilisant:
getItimer () code> etSettitimer () code> (probablement uniquement la fonctionSétititimer () code> sera nécessaire. Suggérez la page de lecture de l'homme pour < Code> Settitimer () Code>Suggérez en utilisant la fonction
SELECT () CODE>, avec le dernier paramètre étant unstruct Timeval code> avec le contenu étant de 15 secondes