我是一个非常新的编码器,我遇到了一个奇怪的问题,我必须为一项任务做一个代码。分配要求我创建一个菜单提供选项,如果您选择其中一个选项,它(除其他外)将要求您输入,然后验证您的输入仅包含小写字母或空格。现在,我有这个代码:
#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语句中列出的条件的字符?
如果这是一个简单的问题,我道歉,我已经研究了一下,并问我的朋友,他们是经验丰富的编码员,还没有弄清楚。谢谢!
答案 0 :(得分:0)
scanf("%d", &a);
将换行符\n
留在缓冲区中。
这意味着letra1
包含\n
,除非你这样做:
scanf(" %c", &letra1);
进一步explanation:
scanf()
函数在尝试解析字符以外的内容之前会自动删除空格。字符格式(主要是%c
;扫描集%[…]
- 和%n
)也是例外;他们不会删除空格。使用前导空格
" %c"
跳过可选空格。不要在scanf()
格式字符串中使用尾随空白。