我有以下数组:
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检查每个字符,但这有点麻烦,我想知道是否有做我想做的事情更容易吗?
答案 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
。