C:验证输入数组元素

时间:2018-01-15 23:10:02

标签: c arrays string

代码提示用户输入一个包含混合类型值的字符串(该字符串可以包含一位数的整数,特殊字符,如' - '或单个字符),并且输入是按字母顺序存储的写入字符数组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;
    }
}

} 

2 个答案:

答案 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");
        }
    }
}