我想创建一个程序,说明一个数字是奇数还是偶数,但如果我输入一个字母,程序必须停止。我想要做的是创建一个if语句,允许程序理解我输入的是一个数字还是其他东西。 这是代码。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a,b;
printf("type a number ");
scanf("%d", &a);
printf("\n");
if (a<0) //This is supposed to understand if what I typed is a number, but it's not correct at all.
{
printf("ERROR, YOU MUST TYPE A NUMBER, NOT LETTERS.");
system("PAUSE \n");
return 0;
}
b=(a%2);
if (b != 0)
{
printf("it's an odd number! ");
printf("\n\n");
system("PAUSE");
return 0;
}
else
{
printf("it's an even number! ");
printf("\n\n");
system("PAUSE");
return 0;
}
}
答案 0 :(得分:2)
scanf()
返回匹配的格式说明符数,因此如果输入的文本不能解释为十进制整数,则返回零。
printf("type a number ");
int converted = scanf("%d", &a);
printf("\n");
if( converted == 0)
{
printf("ERROR, YOU MUST TYPE A NUMBER, NOT LETTERS.");
system("PAUSE \n");
return 0;
}
测试少于零将不起作用,因为-1例如是完全有效的十进制整数。如果您将a
初始化为-1,它可能似乎有效,但您无法输入负数。这就是说scanf()
并不保证不会在匹配失败时修改参数。
答案 1 :(得分:1)
检查a<0
在这种情况下是否不起作用,因为scanf()
如果未找到整数则返回0,或者找到整数的数量。另一种情况是,如果在进行任何转换之前输入了EOF,则返回EOF。只需检查scanf()
是否成功读取一个整数:
if (scanf("%d", &a) != 1) {
printf("Invalid number\n");
exit(EXIT_FAILURE);
}
/* else, valid integer was found */
/* other code */
您也可以使用fgets(3)
来读取输入字符串,并使用strtol(3)
进行更彻底的整数转换。这是一个例子:
char number[50];
char *endptr;
int num;
size_t slen;
if (fgets(number, 50, stdin) != NULL) {
/* removes newline appended from fgets() */
slen = strlen(input);
if (slen > 0 && number[slen-1] == '\n') {
number[slen-1] = '\0';
}
num = strtol(number, &endptr, 10);
if (endptr == number) {
/* No digits found */
}
if (*endptr != '\0') {
/* more characters found after number */
}
/* more error checking at man page */
}
答案 2 :(得分:0)
您可以使用格式读取字符缓冲区,例如%40s(假设您的缓冲区为40个字符),然后使用strtol()查看令牌是否为整数,而不会在末尾添加额外的垃圾。