C 验证数字和数字的长度

C 验证数字和数字的长度,c,validation,char,int,type-conversion,C,Validation,Char,Int,Type Conversion,我一直在与一个项目斗争,所以我必须验证C中的4位数字,我考虑使用字符,因为我需要验证0001但不是1。然后我想我需要把它转换成一个整数来处理它。有人能帮我吗 printf("Enter a number 0 to end:"); gets(str); while (strcmp(str, "0")) { j = 0; k = 0; flag = 0; while (*(cad + j)) { if (!isdigit(*(cad + j)))

我一直在与一个项目斗争,所以我必须验证C中的4位数字,我考虑使用字符,因为我需要验证0001但不是1。然后我想我需要把它转换成一个整数来处理它。有人能帮我吗

printf("Enter a number 0 to end:");
gets(str);
while (strcmp(str, "0"))
{
    j = 0;
    k = 0;
    flag = 0;
    while (*(cad + j)) {
        if (!isdigit(*(cad + j))) 
            flag = 1;
        j++;
        k = ++;
    }

    if (!flag && k == 4) {
        i = atoi(cad); 
        q = newnode();
        q->num = i;
        stack(&pi,q);
    }
    else
        printf("Wrong number");
    printf("Enter a number 0 to end:");
    gets(str);
}
我想你想要这个

#include <stdio.h>
#include <stdlib.h>

int 
is_valid_number(const char *const string, int *value)
{
    char *endptr;
    *value = strtol(string, &endptr, 10);
    return (((endptr - string) == 4) && (*endptr == '\0'));
}

int 
main(void)
{
    int value;
    const char *string = "001";
    if (is_valid_number(string, &value) != 0)
        fprintf(stdout, "it's valid: %d\n", value);
    else
        fprintf(stdout, "\033[31mINVALID\033[0m\n");
    return 0;
}
#包括
#包括
int
是否为有效数字(常量字符*常量字符串,int*值)
{
char*endptr;
*值=strtol(字符串和endptr,10);
返回(((endptr-string)==4)和(*endptr=='\0');
}
int
主(空)
{
int值;
常量字符*string=“001”;
如果(是有效的数字(字符串和值)!=0)
fprintf(标准值,“有效:%d\n”,值);
其他的
fprintf(标准输出,“\033[31mINVALID\033[0m\n”);
返回0;
}
右声道操作(除了
get()

charstr[50];
fputs(“输入一个数字0结束:”,标准输出);
while(fgets(str,sizeof str,stdin)!=NULL)){
str[strcspn(str,“\n”)]='\0';//去除潜在拖尾\n
如果(strcmp(str,“0”)==0){
打破
}
#定义n4
int all_数字=1;

for(int j=0;jYor代码不可读。请不要使用
get()
它已被弃用。您是否阅读了
strcmp()中的内容
是吗?这部分
我需要验证0001,但没有1。
对我来说不清楚。你能给我们一个例子说明它应该失败的地方和应该成功的地方吗如果你输入1应该是无效的,如果你输入0001应该是有效的,这就是为什么我使用字符串按数字验证数字。但是这是一个通用的验证规则还是
0001
唯一有效的值?如果是这样,您想检查它是否有4个字符,并且是一个数字?
是有效的数字(“0”,…)
是有效的数字(“-123”,…)
将通过。@chux很好的观察,但是让我们看看OP是否可以从这里计算出来……因为一个简单的
如果(…<0)
就可以了。
char str[50];
fputs("Enter a number 0 to end:", stdout);

while (fgets(str, sizeof str, stdin) != NULL)) {
  str[strcspn(str,"\n")] = '\0';  // lop off potential trailing \n
  if (strcmp(str, "0") == 0) {
    break;
  }
  #define N 4
  int all_digits = 1;
  for (int j = 0; j<N; j++) {
    if (!isdigit((unsigned char) str[j])) {
      all_digits = 0;
      break;
    }
  }   
  if (all_digits && str[N] == '\0')  {
    i = atoi(str); 
    ...
    }
  else
    fputs("Wrong number", stdout);
    ...