我正在尝试通过模式检查来检查输入的字符是否为数字。
我写了以下程序。
这个程序没有给我以下测试用例的完美输出 任何人都可以告诉我,我的逻辑出错了。
/*
Output test case
234234 = It's a digit.
a3434a = It's not a digit.
33aa3a = It' not a digit.
*/
#define yes 1
#define no 0
#include <stdio.h>
int main(void)
{
char c[30];
int arr_size, result, i=0, state;
printf("Enter your digit:= ");
scanf("%s",&c);
arr_size=(sizeof(c)/sizeof(c[0]));
for(i; i < arr_size; i++)
{
if(check_digit(c[i]))
state = yes;
else
state = no;
}
if(!state)
printf("It's not a digit\n");
else
printf("It's a digit\n");
system("\npause");
return 0;
}
int check_digit(char c)
{
return (c>='0' && c<='9');
}
答案 0 :(得分:1)
sizeof
感到奇怪。 man isdigit
&c[0]
。但是,c
所有的寂寞都是一个指针,所以你可以说scanf("%s", c);
state
变量。尝试在纸上手工运行一些值,看看它会发生什么。 答案 1 :(得分:0)
每次迭代时,for
循环遍历数组设置state
中的每个字符。每次设置state
时,都会忘记之前的值。
因此,您的for
循环实际上等同于编写
state = is_digit(c[29]);
您需要进行两项更改:
TRUE
。因为这看起来像是作业,所以我不会为你完整地编写代码!
答案 2 :(得分:0)
您始终覆盖state
,因此仅检查最后一个元素是否为数字。
if(check_digit(c[i]))
state = yes;
else
state = no;
改为使用:state = (state_digit(c[i]) && state)
[和初始状态为yes
]:这意味着,您正在寻找一个“无数字”的条目,一旦找到它,您就会提出答案。< / p>
一旦找到非数字,另一种可能性就是break
。
答案 3 :(得分:0)
arr_size=(sizeof(c)/sizeof(c[0]));
//arr_size=30/1
for(i; i < arr_size; i++)
//for(i; i < 30; i++)
如果您输入的数字小于30位,则不会声明为“否”...
如果你输入一个这样的30位数字:12234**************8877
,那么数字的最后一位数字不是“7”会使得统计数据为是吗?
使用if(isdigit())
和for(i; i < strlen(c); i++)
只要国家变为否,就会休息。