首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

学c语言两年了,还搞不懂这个有关问题

2013-12-10 
学c语言两年了,还搞不懂这个问题。以前学过一段时间,后来很长一段时间没碰过了,于是就忘记了很多,现在又开

学c语言两年了,还搞不懂这个问题。
以前学过一段时间,后来很长一段时间没碰过了,于是就忘记了很多,现在又开始看书,看到这个地方一直不明白。哪位高手能帮忙解释下?
#include<stdio.h>
#include<ctype.h>
main()
{
char ch, ch1;
while (1)
{
printf("input the character('q' to quit):");
ch = getchar(); /*从键盘中获得一个字符*/
ch1 = getchar(); /*ch1接收从键盘中输入的回车*/
if (ch == 'q' || ch == 'Q')/*判断输入的字符是不是q或Q*/
break;/*如果是q或Q跳出循环*/
if (isalpha(ch))/*检测输入的是否是字母*/
printf("\n%c is a letter.\n\n", ch);
else
printf("\n%c is not a letter.\n\n", ch);
}
}
为什么要定义一个ch1?getchar不是每次只可以读取一个字符吗?我把ch1 = getchar(); 这句删除后运行程序,输入jkl,结果输出j is a letter,k is a letter,l is a letter,  is a letter,4句。getchar不是每次只读取一个字符吗?我输入j之后为什么还会继续读入k,l,和回车符?
[解决办法]
输入必须有结束标志,要不计算机不知道是否输入完成,回车就是完成标志。但是每次只取一个字符,所以显示了4次
[解决办法]
你的程序是循环的啊,getchar虽然一次只读取一个,但是多输入的字符会留在缓冲区里等待下一次读取。当你下一次执行到getchar里时,如果缓冲区里有内容会直接读取,而不需要你再输入。你输入了 jkl回车 4个字符,所以就执行了4次,没什么问题。

至于是否定义ch1就没必要了,本身并没有什么用处。一般回车符是要被吸收掉的,建议加getchar()。不过如果你加了这句 你一次输入很长的字符串 那么内容会被间隔,要注意下。比如 abcd回车,其实只吸收了ac回车。
[解决办法]
缓冲区有一个会回车符阿!每次重新输入的时候,第一个会吃掉上次遗留下来的回车符的!
所以额外加一个getchar(),来确定下一次输入的正确性!
[解决办法]
getchar是用来读取输入缓冲区里面的一个字符。你输入的q是一个字符,回车也是一个字符。所以,你要用ch1 = getchar(); 去读取这个回车字符,免得ch读取了这个回车字符。
[解决办法]
你要知道系统是有一个键盘缓冲区的。对于控制台一般是行缓冲,也就是遇到回车键,就刷新缓冲区。只有在刷新缓冲区的时候你的代码才会接收到一个个的字符,包括回车键。
[解决办法]

#include <conio.h>
#include <ctype.h>
int main() {
    char ch;

    while (1) {
        cprintf("input the character('q' to quit):");
        ch = getch();
        if (ch == 'q' 
[解决办法]
 ch == 'Q') break;
        if (isalpha(ch))
            cprintf("\r\n%c is a letter.\r\n", ch);
        else
            cprintf("\r\n%c is not a letter.\r\n", ch);
    }
    return 0;
}

[解决办法]
getchar()是每次读取 一个字符没错,但是你输入的是一个符加一个回车。这个回车不会凭空消失,会在输入缓冲区中保留。就好像是一个队列,等到下次有输入需要的时候,从这个输入缓冲区中再取出来给到相应的输入中去。

#include<stdio.h>
int main()
{
    getchar();
    //fflush(stdin);
    getchar();
    return 0;
}


比如这段代码,我们输入一个'a'字符和一个回车;结果会直接结束这个程序。因为回车被第二个getchar()接收了。
更优雅的解决方法是手动清除输入缓冲区,注释的那行代码,fflush(stdin)就是显示 的把输入缓冲区清空。这样,当我们输入一个'a'字符和一个回车时,清空了输入缓存。所以程序就会停止在第二个getchar()处等待输入。

热点排行