[英]Validating User Input for Specific Char
我正在创建一个运行纸牌游戏的程序,我需要获得王牌服装(H,D,S,C)并验证用户输入。 我可以捕获j或3之类的无效内容,但是如果它们输入HH或SS(无效),则认为它是正确的。
我试过使用strlen看看是否还有更多的字符,我想也许我可以检查一下缓冲区中是否还有其他垃圾,但是不知道该怎么做。 我也尝试做类似while(scanf(" %c", &trump) != 1
事情,但这while(scanf(" %c", &trump) != 1
,我只用c编写了一个星期。
我的翻车功能
char getTrump(){
char trump;
char ch;
char correct = 1;
while(correct == 1){
printf("Please choose a trump suit (H, D, S, C): ");
scanf(" %c", &trump);
while(getchar() != '\n');
if(isValidSuit(trump) == 1){
printf("Correct\n");
return trump;
correct = 0;
}else{
printf("Please enter a valid suit.\n");
}
}
}
以及是否有帮助我的isValidSuit函数(必须具有char作为参数)
int isValidSuit(char c){
char suits[] = {'H', 'D', 'S', 'C'};
for(int i = 0; i < 4; i++){
if(suits[i] == c){
return 1;
}
}
return 0;
}
运行它的一个例子:
Please choose a trump suit (H, D, S, C): j
Please enter a valid suit.
Please choose a trump suit (H, D, S, C): HH
Correct
如果他们输入HH或SS(无效),则认为它是正确的。
当然,因为当您输入HH
, scanf(" %c", &trump);
读取trump
变量中输入的第一个H
,然后将第二个输入H
保留在输入缓冲区中。 之后, while
循环中的getchar()
读取剩余的用户输入。 isValidSuit()
找到H
作为trump
变量的值,并返回1
。 因此,您将获得HH
或SS
输入Correct
的信息。
要解决此问题,您可以检查输入是否超过1
字符并且该字符不是换行符,而不是提示用户输入有效输入,例如:
char getTrump(){
char trump;
char ch;
char correct = 1;
while(correct == 1){
printf("Please choose a trump suit (H, D, S, C): ");
scanf(" %c", &trump);
if (getchar() != '\n') {
while(getchar() != '\n');
printf("Please enter a valid suit.\n");
continue;
}
.......
.......
我认为使用fgets
作为用户输入会更好(总而言之)。 scanf
的比较存在问题。 在这种情况下,fgets从stdin(键盘)读取输入。 现在,很容易删除任何换行符并测试长度。
char getTrump(){
const int suitSize = 12;
char suit[suitSize];
bool correct = false;
memset(suit, 0, suitSize);
do
{
printf("Please choose a trump suit (H, D, S, C): ");
fgets(suit, suitSize-1, stdin);
if (suit[strlen(suit)-1] == '\n')
suit[strlen(suit)-1] = '\0';
// check input length only one char
if (strlen(suit) == 1 && isValidSuit(*suit) == 1){
printf("Correct\n");
correct = true;
}
else{
printf("Please enter a valid suit.\n");
}
} while (!correct);
return *suit;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.