所以我们正在开发一个策划游戏,每当有人输入一个字符串时,它就会变得怪异。
//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;
}
答案 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
不是a
,b
,c
,d
,e
或f
,{ {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
,然后使用但不存储一切都到下一个换行。
注意 - 只要您发现自己创建了一堆具有相同名称且序数为c
,space1
,space2
的相同类型的变量, ,space3
,那么你通常最好使用数组。
把这一切放在一起,我们得到:
space4
如果没有看到更多代码,我不知道这是否有用。