回 帖 发 新 帖 刷新版面

主题:接收字母输入的函数,非首次输入字母时需要输入两次

get_choice函数要求输入字母A、B、C、D、Q或者a、b、c、d、q,其他均为非法输入,返回字母a、b、c、d、q。
[code=c]
int get_choice(void)
{
    int ch;
    
    printf("Please the operation of your choice:\n");
    printf("A.add     \tB.subtract\n");
    printf("C.multiply\tD.divide\n");
    printf("Q.quit\n");
    ch=get_first();
    while((ch<'a'||ch>'d')&&(ch<'A'||ch>'D')&&ch!='q'&&ch!='Q'){
    /*使用while((ch<'a'||ch>'d')&&(ch<'A'||ch>'D')&&(ch!='q'||ch!='Q')),
     *则不能响应字母“Q”和“q”,属于非法输入
     */
        printf("Please input A, B, C, D, Q or a, b, c, d, q.\n");
        //不是首次输入的话,任何输入都需要输入两次
        ch=get_first();
    }
    if((ch>='A'&&ch<='D')||ch=='Q')
        ch+=32;
    
    return ch;
}
[/code]
在第二次以及其后输入字母的时候,不管输入其他什么都会提示“Please input A, B, C, D, Q or a, b, c, d, q.”,需要再次输入才能进行判断。
还有,语句while((ch<'a'||ch>'d')&&(ch<'A'||ch>'D')&&(ch!='q'||ch!='Q'))跟语句while((ch<'a'||ch>'d')&&(ch<'A'||ch>'D')&&ch!='q'&&ch!='Q')在逻辑上不是一样的么?怎么前者就无法接受Q和q呢?
这是输出结果:
Please the operation of your choice:
A.add B.subtract
C.multiply D.divide
Q.quit
a
Please input a float number: 2
Please input a float number: 3
2.0 + 3.0 = 5.0.
Please the operation of your choice:
A.add B.subtract
C.multiply D.divide
Q.quit
b
Please input A, B, C, D, Q or a, b, c, d, q.
b
Please input a float number: 6
Please input a float number: 4
6.0 - 4.0 = 2.0.
Please the operation of your choice:
A.add B.subtract
C.multiply D.divide
Q.quit
c
Please input A, B, C, D, Q or a, b, c, d, q.
c
Please input a float number: 3
Please input a float number: 0
3.0 * 0.0 = 0.0.
Please the operation of your choice:
A.add B.subtract
C.multiply D.divide
Q.quit
d
Please input A, B, C, D, Q or a, b, c, d, q.
d
Please input a float number: 6
Please input a float number: 8
6.0 / 8.0 = 0.8.
Please the operation of your choice:
A.add B.subtract
C.multiply D.divide
Q.quit
q
Please input A, B, C, D, Q or a, b, c, d, q.
q

回复列表 (共6个回复)

沙发

首先,你真正的读入字符的函数 没给出来....但是还是可以肯定你忘记了回车也是一个字符,也会被读取被判断,这个自己想办法解决。
while((ch<'a'||ch>'d')&&(ch<'A'||ch>'D')&&(ch!='q'||ch!='Q')) 这个如果输入Q,那么ch!=‘q’就成立了  ||后面的语句C语言就不再判断了 。。。

板凳

我发现我没有图像,换了图像,看看效果

3 楼

.....................

4 楼

这是函数中用到get_first的代码
[code=c]
int get_first(void)
{
    int ch;

    ch=getchar();
    while(getchar()!='\n')
        continue;

    return ch;
}
[/code]

5 楼

。。。。还不是回车字符的问题,你每一次输入计算之后有没有对回车字符进行过滤? 没有!!!

6 楼

关于缓冲区里面的换行符,我也知道需要消除,get_first函数也是仿照着教材上的实例来的,搞不出来为什么不生效。
我就是想不出来才问的,但凡自己可以解决,就绝不上论坛了,每次都是好几天之后才上论坛问都是实在无奈了。
自己糊里糊涂的,再思考也是白搭,还请你直接指明吧。

我来回复

您尚未登录,请登录后再回复。点此登录或注册