C:验证输入数组元素

C:验证输入数组元素,c,arrays,string,C,Arrays,String,代码提示用户输入一个混合类型值的字符串(该字符串可以包含一位整数、特殊字符,如“-”或单个字符),并将输入逐字存储到字符数组字符数组[10] 然后,我编写了一个for循环来遍历每个元素,以检查是否存在任何无效字符(即不是一个单位数整数、不是“-”的特殊字符或不是我选择的单个字符) 但是,无论输入是什么(即使输入仅包含所需字符),无效字符的错误消息始终显示。我通过逐个打印每个元素来检查数组中存储的内容,它们看起来很好。为此,我应该如何修复代码 int main(void){ char in[10

代码提示用户输入一个混合类型值的字符串(该字符串可以包含一位整数、特殊字符,如“-”或单个字符),并将输入逐字存储到字符数组
字符数组[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;
    }
}

} 
int main(无效){
[10]中的char;
printf(“仅输入0-9或“-”或“w:”);
扫描频率(“%s”,英寸);
getchar();
int i;
对于(i=0;i<11;i++){
while(in[i]!=“0”| in[i]!=“1”| in[i]!=“2”| in[i]!=“3”|
在[i]!=“4”|在[i]!=“5”|在[i]!=“6”|在[i]!=“7”|
在[i]!='8'|在[i]!='9'|在[i]!='-'|在[i]!='x')
{
printf(“错误:无效输入\n”);
printf(“输入另一个:”);
扫描频率(“%s”,英寸);
getchar();
i=0;
}
}
} 

条件
在[i]!='0'| | in[i]!='1'…
将始终为真,因为单个字符始终为
!='0'
!='1'
。你可能在[i]中的意思是
!='[i]!='1'


(i=0;i<10;i++)应该是
,而不是
11
,因为这会超出数组边界。

错误是因为迭代条件应该是
i<10
(否则您访问的位置
10
,超出数组限制)

您还应该检查字符
\0
,它表示字符串的结尾,并停止检查密码

正如Stephen指出的,您还应该使用
&&
检查您的条件

应该使用
if
而不是while,否则将进入无限循环

正如其他用户指出的那样,
getchar()
不是必需的

最后,您可以这样更好地进行检查:

if ((in[i] < '0' || in[i] > '9') && in[i] != '-' && in[i] != 'x') {
    // bad character found
}

最好使用
isdigit()
函数,而不是不必要的数字检查。问题是,在执行
sscanf
之后,您正在调用
getchar()
。。为什么?如果你有一个变量
a
,条件
(a!=1 | | a!=2)
将始终返回true,因为如果
a
不是
1
,那么该条件基于
(a!=1)
,如果
a
1
,那么该条件基于
(a!=2)
。您的
语句在[i]!='0'| | in[i]!='1'| |…
始终为真。
for(i=0;i<11;i++){
i==10
-->
for(i=0;i<10;i++){
@t0mm13b最有可能清空缓冲区,因为
scanf
保留了换行符。可能更慢,但更容易阅读:
if(!strchr(“0123456789-x”,in[i]))…提到换行符也将在缓冲区中可能有用。@t0mm13b:
%s
scanf
跳过下一轮中的前导空格……以及不必要的
getchar
获取换行符。
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");
        }
    }
}