代码提示用户输入一个包含混合类型值的字符串(该字符串可以包含一位数的整数,特殊字符,如' - '或单个字符),并且输入是按字母顺序存储的写入字符数组char array[10]
。
然后我编写了一个for循环来循环遍历每个元素以检查是否存在任何无效字符(即不是单个数字的整数,特殊字符不是' - '或单个字符不是我的选择)。
但是,无论输入是什么(即使输入只包含想要的字符),也会显示无效字符的错误消息。我通过逐个打印每个元素来检查存储在数组中的内容,它们看起来很好。我应该如何修复我的代码呢?
int main(void){
char in[10];
printf("Enter only 0-9 or '-' or 'w':");
scanf("%s", in);
getchar();
int i;
for(i = 0; i < 11; i++){
while(in[i] != '0' || in[i] != '1' || in[i] != '2' || in[i] != '3' ||
in[i] != '4' || in[i] != '5' || in[i] != '6' || in[i] != '7' ||
in[i] != '8' || in[i] != '9' || in[i] != '-' || in[i] != 'x')
{
printf("Error: Invalid input\n");
printf("Enter another one:");
scanf("%s", in);
getchar();
i = 0;
}
}
}
答案 0 :(得分:1)
条件in[i] != '0' || in[i] != '1' ...
始终为真,因为单个字符始终为!='0'
或!='1'
。你可能意味着in[i] != '0' && in[i] != '1'
。
它应该是for(i = 0; i < 10; i++)
,而不是11
,因为这会超出数组范围。
答案 1 :(得分:0)
错误是因为您的迭代条件应为i < 10
(否则您将访问位置10
,这超出了数组限制。)
您还应该检查字符\0
,它表示字符串的结尾,并停止检查密码。
正如斯蒂芬指出的那样,你也应该用&&
来检查你的条件。
您应该使用if
而不是一段时间,否则您将进入无限循环。
正如其他用户指出的那样,getchar()
不是必需的。
最后,你可以用更好的方式进行检查:
if ((in[i] < '0' || in[i] > '9') && in[i] != '-' && in[i] != 'x') {
// bad character found
}
您还应该将所有这些内容包含在while(badInput == true)
中,而不是在检查中调用scanf
。
我以这种方式实现一切:
char in[10];
bool badInput = true;
while (badInput) {
printf("Enter only 0-9 or '-' or 'w':");
scanf("%s", in);
badInput = false;
if (in[0] == '\0') {
// no input, whoops
badInput = true;
}
for (int i = 0; i < 10 && !badInput && in[i] != '\0'; i++) {
if ((in[i] < '0' || in[i] > '9') && in[i] != '-' && in[i] != 'x') {
badInput = true;
printf("Error: Invalid input\n");
}
}
}