#include<stdio.h>
#include<stdlib.h>
char *meun[]={"a = add new record","b - delete record","q - quit",NULL};
int getchoice(char *greet, char* choices[]);
int main()
{
int choice = 0;
do{
choice = getchoice("请输入一个选择",meun);
printf("您的选择是:%c\n",choice);
}while(choice != 'q');
return 0;
}
int getchoice(char* greet, char* choice[])
{
int chosen = 0;
int selected;
char** option;
do
{
printf("choice:%s\n",greet);
option = choice;
while(*option)
{
printf("%s\n",*option);
option++;
}
selected = getchar();
option = choice;
while(*option)
{
if(selected == *option[0])
{
chosen = 1;
break;
}
option++;
}
if(!chosen)
printf("选择错误,请重新选择");
}
while(!chosen);
return selected;
}
上面这个程序很具有代表性,在进行输入的时候,常常会遇见无限循环,缓存错误的问题。
一般来见,我们使用getchar,scanf等函数,是在输入后,然后输入换行符才会对输入的字符进行读取
这是一种标准模式,称之为行处理。
上面程序的问题在于,输入的字符读取后,再遇见换行符之前,会把字符全都放在缓存中,再遇见换行符后,会把换行符号一起传递给程序,
因此在循环中,程序接受到了换行符,必须在处理过程中解决这个问题
//修改方法如下
do{
selected = getchar();
}while(selected == '\n');
修改后的代码如下
#include<stdio.h>
#include<stdlib.h>
char *meun[]={"a = add new record","b - delete record","q - quit",NULL};
int getchoice(char *greet, char* choices[]);
int main()
{
int choice = 0;
do{
choice = getchoice("请输入一个选择",meun);
printf("您的选择是:%c\n",choice);
}while(choice != 'q');
return 0;
}
int getchoice(char* greet, char* choice[])
{
int chosen = 0;
int selected;
char** option;
do
{
printf("choice:%s\n",greet);
option = choice;
while(*option)
{
printf("%s\n",*option);
option++;
}
selected = getchar();
option = choice;
while(*option)
{
if(selected == *option[0])
{
chosen = 1;
break;
}
option++;
}
if(!chosen)
printf("选择错误,请重新选择");
}
while(!chosen);
return selected;
}
上面这个程序很具有代表性,在进行输入的时候,常常会遇见无限循环,缓存错误的问题。
一般来见,我们使用getchar,scanf等函数,是在输入后,然后输入换行符才会对输入的字符进行读取
这是一种标准模式,称之为行处理。
上面程序的问题在于,输入的字符读取后,再遇见换行符之前,会把字符全都放在缓存中,再遇见换行符后,会把换行符号一起传递给程序,
因此在循环中,程序接受到了换行符,必须在处理过程中解决这个问题。
2.重定向输出
我们经常在Linux中使用重定向,这样屏幕就不会有输出,而是输出到重定向的对象中
如何查看是否重定向成功?
只需要检查底层文件描述符是否关联到一个终端即可:int isatty(int fd); fd代表文件描述符,如果关联到了,则返回1,否则返回0