如果在布尔函数中调用的语句保持返回false

时间:2017-10-27 12:55:27

标签: c boolean

我是一个非常新的编码器,我遇到了一个奇怪的问题,我必须为一项任务做一个代码。分配要求我创建一个菜单提供选项,如果您选择其中一个选项,它(除其他外)将要求您输入,然后验证您的输入仅包含小写字母或空格。现在,我有这个代码:

#include <stdio.h>
#include <stdbool.h>
void menu(void)
{
     printf("Por favor introduce una de las siguientes opciones: \n");
     printf("\n");
     printf("1. las frases crecen\n");
     printf("2. las frases decrecen\n");
     printf("3. Salir del programa\n");
     printf("\n");
     printf("Opcion: ");
}

bool es_caracter_admitido(char letra1)
{
    if((letra1 >= 97 && letra1 <= 122) || letra1 == 32 )
    {
        return true;
    }
    else 
    {
        return false;
    }
}

int main()
{
    int a;
    char letra1, letra2;
    menu();
    scanf("%d",&a);
    if (a == 3)
        {
          return 0;  
        }

    else if (a < 0 || a > 3)
        {
            puts("opcion incorrecta");
            return 0;
        }
    printf("introduce una frase (enter para acabar): ");
    scanf("%c", &letra1);
    scanf("%c", &letra2);
            if (es_caracter_admitido(letra1) == true)
                {
                    puts("true");
                }
            else 
                {
                    puts("false");
                }

    getchar();   
}

问题是每当我运行它时,无论我为letra1输入什么, 它返回false。真正奇怪的是,以下代码可以正常工作:

#include <stdio.h>
#include <stdbool.h>

bool test(char letra1)
{
    if((letra1 >= 97 && letra1 <= 122) || letra1 == 32 )
        {
           return true;
        }
        else 
        {
            return false;
        }
}
int main()
{

char letra1, letra2;



        puts("introduce una frase (enter para acabar");
        scanf("%c", &letra1);
        scanf("%c", &letra2);

        if (test(letra1) == true)
            {
            puts("true");
            }
            else 
            {
            puts("false");
            }

return 0;
}

据我所知,两者之间唯一可辨别的区别是第一个调用菜单函数,调用es_caracter_admitido函数的代码包含在if语句中。不知怎的,这导致了这个失败,我不能为我的生活而烦恼。有没有人知道为什么boolean es_caracter_admitido总是返回false,即使例如我输入'a'或属于函数中包含的if语句中列出的条件的字符?

如果这是一个简单的问题,我道歉,我已经研究了一下,并问我的朋友,他们是经验丰富的编码员,还没有弄清楚。谢谢!

1 个答案:

答案 0 :(得分:0)

scanf("%d", &a);将换行符\n留在缓冲区中。

这意味着letra1包含\n,除非你这样做:

scanf(" %c", &letra1);

进一步explanation

  

scanf()函数在尝试解析字符以外的内容之前会自动删除空格。字符格式(主要是%c;扫描集%[…] - 和%n)也是例外;他们不会删除空格。

     

使用前导空格" %c"跳过可选空格。不要在scanf()格式字符串中使用尾随空白。