如何检查输入的值是否是一个字符

时间:2015-07-17 16:59:36

标签: c

所以我们正在开发一个策划游戏,每当有人输入一个字符串时,它就会变得怪异。

    //INVALIDS
if (space1!='a' && space1!='b' && space1!='c' && space1!='d' && space1!='e' && space1!='f')
    {
    printf("Invalid entry.\n");
    goto label;
    }
if (space2!='a' && space2!='b' && space2!='c' && space2!='d' && space2!='e' && space2!='f')
    {
    printf("Invalid entry.\n");
    goto label;
    }
if (space3!='a' && space3!='b' && space3!='c' && space3!='d' && space3!='e' && space3!='f')
    {
    printf("Invalid entry.\n");
    goto label;
    }
if (space4!='a' && space4!='b' && space4!='c' && space4!='d' && space4!='e' && space4!='f')
    {
    printf("Invalid entry.\n");
    goto label;
    }

2 个答案:

答案 0 :(得分:0)

只需在char数组中获取输入,然后将其处理为单个字符。如果有多个alphaneumeric字符,则显示错误或做任何你想做的事。

注意:这不是您编写代码的方式,并且避免goto它会产生一些非常烦人的错误。

一些片段

char s[100];
do
{
scanf("%s",s);
...
}while(strlen(s)>1..)
process s[100]

正如 iharob 所提到的,使用它的更好方法是%n说明符。当在scanf()中使用时,%n格式说明符期望将函数已处理的格式字符串的字符数的计数存储到int *类型的参数中。   所以你可以拥有

 int len;
 scanf("%s%n",s,&len);
 //process len 

chux 提到了更好的解决方案:使用fgets()。 例如..

fgets(s,len+1,stdin);
//process s[]

答案 1 :(得分:0)

将验证逻辑分离为自己的函数。您可以利用标准库中的strchr函数进行此特定测试:

int isValid( int c ) 
{
  static const char *validChars = "abcdef";
  return strchr( c, validChars ) != NULL;
}

如果c的值是validChars中的一个字符,strchr将返回指向该字符的指针,否则它将返回NULL。因此,如果c不是abcdef,{ {1}}函数将返回0(false),否则返回1(true)。

现在,我假设您的isValid变量都是单独的输入,而不是同一输入的一部分。保证单字符输入的最简单(如果不是最直观)方法可能如下:

spaceN

这将告诉char c; if ( scanf( " %c%*[^\n]", &c ) == 1 ) // note leading blank in format string! // valid single-character input 跳过任何前导空格(包括换行符),读取并将第一个非空白字符存储到scanf,然后使用但不存储一切都到下一个换行。

注意 - 只要您发现自己创建了一堆具有相同名称且序数为cspace1space2的相同类型的变量, ,space3,那么你通常最好使用数组。

把这一切放在一起,我们得到:

space4

如果没有看到更多代码,我不知道这是否有用。