数组只包含数字吗?

时间:2012-12-11 20:08:59

标签: c arrays

这是“无所畏惧”的方法

int isNumeric ( const char * str ) {
    char * pch = (char*)str;
    while ( pch != '\0' ) {
        if ( *pch < '0' || *pch > '9' ) return 0;
        pch++;
    }
    return 1;
}

有优雅的方式吗?

编辑:问题应标题为“数组是否只包含数字”,因为不允许使用负数和浮点数。

6 个答案:

答案 0 :(得分:4)

以下是使用isdigit()重写代码的一种方法,这非常有效:

int isNumeric ( const char * str )
{
    while (isdigit(*str))
        str++;
    return (*str == '\0');
}

但是,此代码重复了代码中的缺陷。如果字符串为空,则返回true。您可以轻松插入检查以确认您没有空字符串。

答案 1 :(得分:1)

您可以使用strspn()

int hasNumber = strspn(str, "0123456789")

答案 2 :(得分:0)

ctype.h具有以下功能:

int isalnum(int c);
int isalpha(int c);
int isascii(int c);
int isblank(int c);
int iscntrl(int c);
int isdigit(int c);
int isgraph(int c);
int islower(int c);
int isprint(int c);
int ispunct(int c);
int isspace(int c);
int isupper(int c);
int isxdigit(int c);

答案 3 :(得分:0)

您可以使用int isdigit(int ch);中的ctype.h

答案 4 :(得分:0)

是的,有:

#include <ctype.h>
#include <stdlib.h>
int isNumeric (const char * s)
{
    char *p;
    if (s == NULL || *s == '\0' || isspace(*s))
      return 0;

    strtol (s, &p, 10);
    return *p == '\0';
}

如果string不表示数字,strtol会将p指向解析后的数字后的第一个元素,因此我们需要检查整个字符串是否解析得很长。

答案 5 :(得分:0)

您也可以这样做:

char *q = s, *p = s;
while(*p >= '0' && *p <= '9') p++; 
return q != p && *p == 0;

如果通过停止非空值看到非数字,则循环结束,p == 0检查我们是否已遍历所有字符。

查看ctype.h,它具有本机isdigit()宏或函数(如果你取消设置isdigit),编译器通常会做出很好的优化,因此最好使用它。

编辑:

已添加:q != p如果pNULL

,则会在测试前通过比较地址来确保迭代完成