簡體   English   中英

K&R 1-10,終端吃退格

[英]K&R 1-10, the terminal eats the backspace

K&R C 1-10讀取:

“編寫一個程序將其輸入復制到其輸出,用\\ t替換每個選項卡,用\\ b替換每個退格,用\\替換每個反斜杠。這使得選項卡和退格以明確的方式顯示。”

我有以下代碼,它不適用於退格字符,因為終端吃字符。 到目前為止,似乎沒有一本解決方案與書中涵蓋的材料有關。 解決方案是什么?

#include <stdio.h>

main()
{
    int c;

    while((c = getchar()) != EOF) {

        switch (c) {
            case '\t':
                printf("\\t");
                break;
            case '\b':
                printf("\\b");
                break;
            case '\\':
                printf("\\\\");
                break;
            default:
                putchar(c);
        }
    }
}

這里沒有錯。 如果您要在包含退格符的文件上運行此程序,它將正確轉換它。 對於終端輸入,程序將不會接收退格,因為它由輸入例程管理。

這是因為操作系統正在處理終端IO,並在程序看到之前處理鍵盤上的字符。

如果你在Unix / Linux系統上,你可以像這樣包裝程序的執行:

$ stty -icanon -echo; ./a.out; stty icanon echo

這將禁止終端驅動程序以某些特定方式處理輸入:icanon可以處理退格處理等事務,而echo則會打印您鍵入的字符。 由於您的程序會回顯字符本身,因此您可以關閉回聲。 唯一的問題是-icanon還會停止EOF處理,因此您需要添加額外的條件才能退出循環:

#include <stdio.h>

#define CTRL(x) (x & 0x1f)

main()
{
    int c;

    while((c = getchar()) != EOF && c != CTRL('d')) {
...

測試這樣的程序在單獨的窗口中運行它們也是一個好主意,因此如果您最終處於一種奇怪的終端模式,您可以快速輕松地終止整個會話!

暫無
暫無

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

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