簡體   English   中英

用C語言以編程方式終止scanf

[英]Terminating scanf programmatically in C language

我正在Linux操作系統上使用C語言進行編程。 我正在寫一個程序來掃描用戶的輸入。 但是,我希望scanf有一定的時間限制。 例如,如果用戶在10秒鍾內未在鍵盤上輸入任何內容,它將跳過scanf並轉到下一行。 我正在使用alarm(10)等待10秒,但是當我轉到alarmhandler時,我不知道該如何跳過scanf。

是否有跳過scanf或例如將\\ n寫入輸入緩沖區的功能?

您可以使用select(2)poll(2)指定超時並檢查stdin是否已輸入。

從警報處理程序返回; scanf的返回值應反映出發生了錯誤情況。 (scanf在出錯時返回EOF)。

注意! 您必須使用sigaction ,因為signal可能會使read()成為基礎可重啟動的scanf()系統調用。

#include <stdio.h>
#include <signal.h>

void handler(int signo)
{
  return;
}

int main()
{
  int x;
  struct sigaction sa;

  sa.sa_handler = handler;
  sigemptyset(&sa.sa_mask);
  sa.sa_flags = 0;
  sigaction(SIGALRM, &sa, NULL);

  alarm(5);

  if (scanf("%d", &x) == 1)
  {
    printf("%d\n", x);
    alarm(0); // cancel the alarm
  }
  else
  {
    printf("timedout\n");
  }
  return 0;
}

您可能要考慮使用ncurses而不是標准I / O。 這有點不可思議,但是它使您免受各種編碼方面的麻煩(可移植性和“您必須完全正確地編寫此代碼,否則它將無法可靠地工作,並且祝您找到好運的文檔”)。 Halfdelay函數似乎提供了一種正是您在此尋找的模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM