_getch与getchar的一些区别 《C程序设计语言》练习1-8~10

《C程序设计语言》Brain&Dennis著 练习1-8~10

    • 主要是关于getchar()与_getch()这2个函数的区别
        • getchar
        • _getch
        • 使用_getch输入ctrl-c/z无效
        • 控制台下ctrl-z输入EOF

代码先附上

#include 
#include 

int count_char(){
    // 统计输入字符数
    long nc = 0;
    while( getchar() != EOF){
        ++nc;
    }
    printf("%ld \n", nc);

    return nc;
}

int count_line(){
    // 统计输入的行数
    /* 标准库保证输入文本流以行序列的形式出现,每一行均以换行符结束
        故统计行数,即为统计'\n'的个数
    */
    int nl, c;
    nl = 0;
    while( (c = getchar()) != EOF){
        if( c == '\n'){
            ++nl;
        }
    }
    printf("%d\n", nl);
    return nl;
}

// 练习1—8
int count_invisible_char(){
    // 统计 \t 空格 \n的个数
    int nc, c;
    nc = 0;
    while( (c = getchar()) != EOF){
        if( c == '\t' || c == ' ' || c == '\n'){    // '\b'是回退符 即backspace键
            ++nc;
        }
    }
    printf("%d\n", nc);
    return nc;
}

// 练习1-9
void just_one_space(){
    // 将输入中连续空格用一个空格代替,然后输出
    int c,temp;
    while( (c = getchar()) != EOF){
        putchar(c);
        while( (temp = getchar()) == ' ')
            ;
        putchar(temp);
    }
}

// 练习1-10
void print_invisible_char(){
    // 将输入字符中的 制表符、回退符、反斜杠,转换为 \t \b \\ 打印输出
    int c;
    while( (c = _getch()) != EOF){    // getchar()是流缓冲,按下回车键后,才从输入流中一个字符一个字符的读取,所以无法读取 backspace
        // 改用 conio.h库中的 _getch():会记录每个按下的键。此时按 ctrl-z/c 都无法终止程序,而显示的是特殊字符
        // 有一点需注意: 按下enter键之后,_getch()接收到的是'\r'即回车,光标跳到本行开头,而getchar()接收到的是'\n'即换行
        if(c == '\r')
            printf("\n");
        if( c == '\t')
            printf("%s", "\\t");
        else if( c == '\b')
                printf("%s", "\\b");
        else if( c == '\\')
                printf("%s", "\\\\");
        else putchar(c);
    }
}

void main(){
    //count_char();
    //count_line();
    // count_invisible_char();
    // just_one_space();
    print_invisible_char();
}

主要是关于getchar()与_getch()这2个函数的区别

做练习1-10的时候,花了一点时间,主要是无法输入回退键 \b。还有就是使用_getch()输入enter键时,获得的字符与getchar不同。

getchar

getchar虽然是一次读入一个字符,但从键盘一次性输入多个字符再按回车键时,getchar其实是以文本流的方式从输入的内容逐个字符读出。所以在按backspace时,屏幕上不会显示\b,只会删去输入内容,因此不能使用getchar。百度后,发现可以使用_getch来解决。

_getch

库提供的函数,它是将每次按键的内容都记录输入了,因此按backspace键时,它就记录了回退符‘\b’。但是在使用_getch后运行程序又发现了一个问题,当按下enter键时,光标从是跳到当前行的开头,再输入的字符将覆盖原来内容。但是之前使用getchar按回车就是换行。所以又查了一下,发现按enter键_getch读入的字符是’\r’,即回车符,而不是换行符’\n’,getchar读到的就是’\n’。为了输出好看点,就添加了判断 '\r’的语句用来输出换行。

使用_getch输入ctrl-c/z无效

我是在控制台运行的C程序,在一般的程序执行时,按下ctrl-c就终止了,但是使用_getch函数,却发现读到的是一个特殊字符,程序并没有终止,暂时我还不知道原因。

控制台下ctrl-z输入EOF

之前在控制台输入EOF值(其实是-1,它是库中用#define定义的字符常量),都是在使用getchar函数情况下,按下ctrl+z得到EOF的,但是使用_getch不行,这是因为,ctrl-z只对以文本流方式读入字符的函数有效,比如getchar、ReadFile等,对_getch无效

你可能感兴趣的:(C语言)