回车和换行的区别(Linux程序设计第4版)

        学习C语言的时候就一直没有搞清楚,这个回车和换行到底又啥子区别,这两个不都是通过按Enter键来搞定的嘛,结果今天看Linux程序设计第4版第五章147页时搞清楚原来是因为在Linux同Unix系统一样,在起内部都是通过换行符作为文本行的结束,也就是说Unix用一个单独的换行副来表示一行的结束,而MS-DOS中用回车符和换行符两个字符的结合来表示一行的结束。如果输入或者输出设备本身需要发送或者接受一个回车符,则由Linux终端处理程序负责完成它。具体的例子可以参考下面的程序:

#include <stdio.h>

char *menu[] = {
    "a - add new record",
    "d - delete record",
    "q - quit",
    NULL,
};

int getchoice(char *greet, char *choices[]);

int main()
{
    int choice = 0;

    do
    {
        choice = getchoice("Please select an action", menu);
        printf("You have chosen: %c\n", choice);
    } while (choice != 'q');
    exit(0);
}

int getchoice(char *greet, char *choices[])
{
    int chosen = 0;
    int selected;
    char **option;

    do {
        printf("Choice: %s\n",greet);
        option = choices;
        while(*option) {
            printf("%s\n",*option);
            option++;
        }
        selected = getchar();
        option = choices;
        while(*option) {
            if(selected == *option[0]) {
                chosen = 1;
                break;
            }
            option++;
        }
        if(!chosen) {
            printf("Incorrect choice, select again\n");
        }
    } while(!chosen);
    return selected;
}

如果在Linux中运行的话,如果输入a/回车/q回车,会出现问题,如下:

$ ./a.out
Choice: Please select an action
a - add new record
d - delete record
q - quit
a
You have chosen: a
Choice: Please select an action
a - add new record
d - delete record
q - quit
Incorrect choice, select again
Choice: Please select an action
a - add new record
d - delete record
q - quit
q

You have chosen: q

$

        之所以出现这个问题是因为Linux会暂存用户输入的内容,知道用户按下回车键,然后用户选择的字符以及紧随气候的回车副一起传递个程序。所以,每当你输入一个菜单选择时,程序就调用一个getchar函数来处理该字符,而当程序在下一次的循环中再次调用getchar函数的时候就会给selected一个回车符,这样导致这个问题的出现。

        避免这种错误的方法是要忽略掉额外的换行符来纠正这个错误:

do{

    selected = getchar();

}while(selected == '\n')


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值