如何遍历字符串中的所有字符并检查它们是否都是C语言中的数字?

如何遍历字符串中的所有字符并检查它们是否都是C语言中的数字?,c,string,function,numbers,c-strings,C,String,Function,Numbers,C Strings,我想找出一种方法来检查字符串的所有字符。在搜索网页后,我发现我可以创建一个函数来完成它,但由于某种原因,它不起作用,即使它非常简单。以下是我的代码: #include <stdio.h> #include <stdlib.h> #include <string.h> struct id{ char id_num[10]; }; int isNumber(char p[]) { int i; for(i=0; i<strlen(

我想找出一种方法来检查字符串的所有字符。在搜索网页后,我发现我可以创建一个函数来完成它,但由于某种原因,它不起作用,即使它非常简单。以下是我的代码:

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

struct id{
    char id_num[10];
};

int isNumber(char p[])
{
    int i;
    for(i=0; i<strlen(p); i++){
        if(isdigit(p[i])){
            return 0;
        }
        else return 1;
    }
}


void read(struct id s)
{
    int len1;
    do{ 
        printf("Give id number: ");
        scanf("%s", s.id_num);
        len1 = strlen(s.id_num);
    } while(len1 < 0 || len1 > 10 || isNumber(s.id_num) == 1);
}

int main(void)
{
    struct id a;
    read(a);
}
如果您想知道为什么我将id_num设置为字符字符串,是因为我需要0到10个字符的数字。 此外,代码没有出现任何错误,但它接受我输入的任何内容。例如,当它不应该接受5555tt时,它接受5555tt。我做错了什么?提前感谢。

对于初学者,函数read应通过引用接受其参数,如

void read(struct id *s);
否则,它的论点就毫无意义

请注意scanf的这种呼吁

这是不安全的。改用fgets。以身作则

void read( struct id *s )
{
    //...
    fgets( s->id_num, sizeof( s->id_num ), stdin );
    s->id_num[strcspn( s->id_num, "\n" )] = '\0';
函数isNumber非常简单

int isNumber( const char p[] ) 
{
    const char *s = p;
    while ( isdigit( ( unsigned char )*s ) ) ++s;

    return  p[0] != '\0' && *s == '\0';
}
也就是说,在条件p[0]!='\0' . 否则,它显然不包含所有数字

第二个条件*s=='\0'意味着我们检查了字符串的所有字符,直到终止零为止。也就是说,字符串只包含数字

这是一个演示程序

#include <stdio.h>
#include <ctype.h>

int isNumber( const char p[] ) 
{
    const char *s = p;
    while ( isdigit( ( unsigned char )*s ) ) ++s;

    return  p[0] != '\0' && *s == '\0';
}

int main(void) 
{
    printf( "Is a number - %s\n", isNumber( "" ) ? "true" : "false"  );
    printf( "Is a number - %s\n", isNumber( "A" ) ? "true" : "false"  );
    printf( "Is a number - %s\n", isNumber( "12A" ) ? "true" : "false"  );
    printf( "Is a number - %s\n", isNumber( "123" ) ? "true" : "false"  );

    return 0;
}
对于初学者,函数read应通过引用接受其参数,如

void read(struct id *s);
否则,它的论点就毫无意义

请注意scanf的这种呼吁

这是不安全的。改用fgets。以身作则

void read( struct id *s )
{
    //...
    fgets( s->id_num, sizeof( s->id_num ), stdin );
    s->id_num[strcspn( s->id_num, "\n" )] = '\0';
函数isNumber非常简单

int isNumber( const char p[] ) 
{
    const char *s = p;
    while ( isdigit( ( unsigned char )*s ) ) ++s;

    return  p[0] != '\0' && *s == '\0';
}
也就是说,在条件p[0]!='\0' . 否则,它显然不包含所有数字

第二个条件*s=='\0'意味着我们检查了字符串的所有字符,直到终止零为止。也就是说,字符串只包含数字

这是一个演示程序

#include <stdio.h>
#include <ctype.h>

int isNumber( const char p[] ) 
{
    const char *s = p;
    while ( isdigit( ( unsigned char )*s ) ) ++s;

    return  p[0] != '\0' && *s == '\0';
}

int main(void) 
{
    printf( "Is a number - %s\n", isNumber( "" ) ? "true" : "false"  );
    printf( "Is a number - %s\n", isNumber( "A" ) ? "true" : "false"  );
    printf( "Is a number - %s\n", isNumber( "12A" ) ? "true" : "false"  );
    printf( "Is a number - %s\n", isNumber( "123" ) ? "true" : "false"  );

    return 0;
}

在for循环中,找到一个数字时退出。因此,如果第一个字符是5,则退出循环。您需要检查所有元素,如果不是数字,则返回1

int isNumber(char p[])
{
    int i;
    for(i=0; i<strlen(p); i++){
        if(!isdigit(p[i])){
            return 1;
        }
    }
    return 0;
}

在for循环中,找到一个数字时退出。因此,如果第一个字符是5,则退出循环。您需要检查所有元素,如果不是数字,则返回1

int isNumber(char p[])
{
    int i;
    for(i=0; i<strlen(p); i++){
        if(!isdigit(p[i])){
            return 1;
        }
    }
    return 0;
}

我想你应该在if上返回0!isdigit…并且您必须废弃否则返回0;在while循环中,选中的条件是isNumbers.id_num==1以继续循环并再次读取。如图所示返回。在检查第一个字符后,修改后的isNumber将始终返回。删除否则返回0;并加上返回0;在函数末尾。@AdrianMole函数在问题中读取时似乎假定返回值1表示输入无效。这与正常的真/假惯例不符。我真的看不出有什么区别。您刚刚在isdigit之前添加了一个感叹号,并更改了0和1?我认为您应该在if上返回0!isdigit…并且您必须废弃否则返回0;在while循环中,选中的条件是isNumbers.id_num==1以继续循环并再次读取。如图所示返回。在检查第一个字符后,修改后的isNumber将始终返回。删除否则返回0;并加上返回0;在函数末尾。@AdrianMole函数在问题中读取时似乎假定返回值1表示输入无效。这与正常的真/假惯例不符。我真的看不出有什么区别。你刚刚在isdigit之前添加了一个感叹号,并更改了0和1?哇,这是可行的,但当我进行第一次更改时,它就不起作用了,你说的是将其变为void readstruct id*s。你能给我解释一下你是如何想出你写的函数的吗?因为我不太懂它,我只是复制了它哈哈!谢谢您的isNumber代码通常适合您,非常出色,@Vlad!但也许能为我们这些小凡人做一点解释?@Ryker我认为这是一个更具表现力的说法。:尽管它可以写成*p!='\0'&&*s=='\0'或其他方式。@AdrianMole-关于您的评论,请参阅上面的2条评论。@Ryker Vlad的编辑是我想要的!这让他从我这里得到了一个艰难的+10!哇,它工作了,但当我做了你说的第一个更改使其无效readstruct id*s时,它就不工作了。你能给我解释一下你是如何想出你写的函数的吗?因为我不太懂它,我只是复制了它哈哈!谢谢您的isNumber代码通常适合您,非常出色,@Vlad!但也许能为我们这些小凡人做一点解释?@Ryker我认为这是一个更具表现力的说法。:尽管它可以写成*p!='\0'&&*s=='\0'或其他方式。@AdrianMole-关于您的评论,请参阅上面的2条评论。@Ryker Vlad的编辑是我想要的!这让他从我这里得到了一个艰难的+10!您应该学习如何使用调试器,并逐行检查程序。您的函数只测试字符串的第一个字符,尽管有循环,但bec
因为函数在一个字符后返回,无论它是否为数字。read确实是一个错误的函数名。有一个广泛使用的POSIX函数称为read。您应该学习如何使用调试器并逐行检查程序。您的函数只测试字符串的第一个字符,尽管是循环,因为函数在一个字符后返回,无论它是否为数字。read确实是一个错误的函数名。有一个广泛使用的POSIX函数称为read。