簡體   English   中英

你如何防止輸入在終端的新行上發送?

[英]How do you prevent input from being sent on new line in terminal?

我正在嘗試了解輸入/輸出的工作原理,並對教科書中的基本代碼感到好奇:

#include <stdio.h>
/* copy input to output; 1st version */

int main()
{
int c;

c = getchar();
while (c != EOF) {
    putchar(c);
    c = getchar();
}
}

在我使用 gcc 將此代碼轉換為可執行文件后,它運行完全正常。 但是,在可執行文件中,每當我按下“enter”時,我的所有輸入都會被發送出去,因此也會在下一行打印為 output。 我如何進行設置,以便我可以得到我想要退出輸入的新行 '\n',而不發出我想要發送輸入的信號? 我目前在 Linux MATE 終端工作,如果這是一個影響因素。

當您在終端中運行此命令(無重定向)時,通常,您輸入的輸入會由終端回顯,並且僅在您按 Enter 后才會發送到您的程序。 然后循環將開始讀取您鍵入的每個字符並顯示它。 之后,它再次等待終端僅在您按下回車后才發送的輸入。

嘗試從文件重定向您的輸入並查看差異。

prompt$ ./yourprogram < somefile

如果您希望能夠立即讀取用戶鍵入的每個字符,則需要使用 tcsetattr function 在程序中禁用規范模式(行緩沖)。 但是,建議先使用 tcgetattr 記錄舊值,然后再將其恢復。 但是,當您的輸入來自終端時,您將看不到 EOF(因此我添加了 q 選項來退出)。 如果這是您要查找的內容,您可能還希望禁用回顯字符(注釋行)。

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int main() {
  struct termios old_tio, new_tio;
  tcgetattr(STDIN_FILENO, &old_tio);
  new_tio=old_tio;
  new_tio.c_lflag &=(~ICANON);
  /* new_tio.c_lflag &=(~ECHO); */
  tcsetattr(STDIN_FILENO, TCSANOW, &new_tio);

  int c;
  c = getchar();
  while (c != EOF) {
    putchar(c);
    c = getchar();
    if (c=='q') break;
  }

  tcsetattr(STDIN_FILENO, TCSANOW, &old_tio);
}

標准輸入是緩沖的,因為在您發送換行符或發送 EOF (某些終端仿真器中的Ctrl D )之前程序不會接收輸入。

如果您需要在輸入到達時處理(擊鍵),您需要使用其他東西(即標准之外)。 例如,ncurses 庫是 Linux CLI 應用程序的流行解決方案。

暫無
暫無

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

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