检查数组索引是数字还是字母?

时间:2014-05-06 18:53:18

标签: c arrays numbers char

我有以下数组:

array[];

我将用户输入为"cd SOMETHING"“SOMETHING”应该是一个数字。 但是,如果用户输入"cd Hello",我想提供错误消息。这是我用来分割用户输入的代码:

char *arguments[80];
char *split;

split = strtok(userInput," ");

while(split != NULL)
{
    arguments[count++] = split; 
    split = strtok(NULL, " ");
}

现在我将usersInput存储在我的arguments数组中:

arguments[0]; (cd) and arguments[1]; (Hello)

在我尝试将参数传递给我的下一个函数(需要一个数字)之前,我需要检查arguments[1]是一个数字还是当前的垃圾。然后,如果它不是数字,则显示错误消息,如果是数字,我可以按照我的意愿继续。

我尝试了isalpha()isdigit(),但它们仅适用于单个字符。

我明白我可以循环遍历argument[1]并将其拆分为单个字符,然后遍历这些并使用isalpha或isdigit检查每个字符,但这有点麻烦,我想知道是否有做我想做的事情更容易吗?

3 个答案:

答案 0 :(得分:3)

  

据我所知,我可以遍历参数[1]并将其拆分为   个别字符,然后循环遍历那些并检查每一个   isalpha或isdigit,但这有点麻烦

麻烦与否,这可能是在C语言中做到最简单的方法,同时允许长篇论据。

int looks_like_number(const char *p)
{
    while (*p) {
        if (!isdigit(*p))
            return 0;

        ++p;
    }
    return 1;
}

或者您可以变量并说:

while (*p && isdigit(*p)) {
    ++p;
}

return *p == 0;

答案 1 :(得分:0)

您实际上不需要将字符串拆分为字符,因为您可以简单地迭代它们。

while(split != NULL)
{
    arguments[count++] = split;

    while(isdigit(*split)) ++split;
    if(*split) error("non-numeric string!");

    split = strtok(NULL, " ");
}

这会增加split,直到找到非数字字符;如果它不是终止字符串的空字符,那么你会产生错误。

答案 2 :(得分:0)

你也可以使用strtol(如果输入应该是一个整数,无论​​如何):

#include <errno.h>
...
char *chk = NULL;
errno = 0;
long val = strtol( arguments[1], &chk, 0 );
if ( !isspace( *chk ) && *chk != 0 )
{
  fprintf( stderr, "%s is not a valid integer string!\n", arguments[1] );
}
else
{
  if ( errno == ERANGE ) 
  {
    fprintf( stderr, "%s cannot be represented as a long\n" );
  }
  else
  {
    // arguments[1] is a valid integer string
    do_something_with( val );
  }
}

strtol获取输入字符串并尝试将其转换为相应的整数值(结果为long)。 chk将指向字符串中的第一个字符 not 有效整数字符串的一部分;如果此字符不是空格或0,则输入不是正确形成的整数字符串。最后一个参数0表示输入字符串可以是十六进制,十进制或八进制格式,并且将被适当地转换。如果要将有效输入限制为十进制格式,请使用10