学习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')