- #include
#define MAX 20
char * getnchar(char * str, int n);
void main(void)
{
char input[MAX];
char *chk;
char n;
scanf("%d",&n);
fflush(stdin); //清空键盘缓冲区
- chk = getnchar(input, n-1);
if (chk == NULL)
puts("Input failed.");
else
puts(input);
puts("Done.\n");
getch();
//return 0;
}
- char * getnchar(char * str, int n)
{
int i;
int ch;
- for (i = 0; i < n; i++)
{
ch = getchar();
if (ch != EOF)
str[i] = ch;
else
break;
}
if (ch == EOF)
return NULL;
else
{
str[i] = '\0';
return str;
}
}
问题:
如果不输入n的值的话,就是说在输入字符串之前没有输入其它的字符的话,是能够完好的输出输入的值的。而加入了输入n之后,输出就只能是前面n-1个字符。原来问题出在键盘输入输入缓冲区,所以必须借用fflush(stdin)来清空输入缓冲区。
getchar的总结:
总结1:
while((c= getchar()) != EOF){ putchar(c); } |
执行程序,输入:abc,然后回车。则程序就会去执行puchar(c),然后输出abc,这个地方不要忘了,系统输出的还有一个回车。然后可以继续输入,再次遇到换行符的时候,程序又会把那一行的输入的字符输出在终端上。
对于getchar,肯定很多初学的朋友会问,getchar不是以字符为单位读取的吗?那么,既然我输入了第一个字符a,肯定满足while循环(c = getchar()) != EOF的条件阿,那么应该执行putchar(c)在终端输出一个字符a。不错,我在用getchar的时候也是一直这么想的,但是程序就偏偏不着样执行,而是必需读到一个换行符或者文件结束符EOF才进行一次输出。
对这个问题的一个解释是,在大师编写C的时候,当时并没有所谓终端输入的概念,所有的输入实际上都是按照文件进行读取的,文件中一般都是以行为单位的。因此,只有遇到换行符,那么程序会认为输入结束,然后采取执行程序的其他部分。同时,输入是按照文件的方式存取的,那么要结束一个文件的输入就需用到EOF (Enf Of File). 这也就是为什么getchar结束输入退出时要用EOF的原因。
总结2:
如果有多个字符串输入(即前面需要输入一个字符或字符串,后面又需要输入一个字符或字符串),需用fflush(stdin)函数来先清空前面的键盘缓冲区,然后在接着输入其它的字符(或者字符串)。
阅读(1555) | 评论(0) | 转发(0) |