处理意外的输入

时间:2011-11-17 20:24:49

标签: c validation input scanf

真的只是一个小查询,通过使用scanf,在我的情况下,将X个整数扫描成变量,每个整数用空格分隔。关于如何处理输入的任何提示/线索如果输入整数时,它们之间没有空格,例如,我的输入是这样的XXXX,但是如果输入了XX XX,我怎么能在我的scanf中处理它功能

请记住我的scanf(%d%d%d%d“....)

干杯。

4 个答案:

答案 0 :(得分:1)

我会用计数器一次读取一个值,并检查一个数字是否大于9,99或999以检查多个数字。如果您这样做,请使用除法提取每个数字,并为每个数字增加计数器。

答案 1 :(得分:1)

您可以检查scanf()的返回值以确保它匹配,然后在收到后验证值是否在0到9之间。像这样:

int vars[4];
if (scanf("%d %d %d %d", vars[0], vars[1], vars[2], vars[3]) != 4) {
    // error
}

然后检查每个变量是否在范围内:

for (int i = 0; i < 4; i++) {
    if (vars[i] < 0 || vars[i] > 9) {
        // error
    }
}

答案 2 :(得分:1)

我只是避免scanf()。如果每个整数只是一个数字,那么以下内容可能会起作用:

int vars[4];
for (int i = 0; i < 4;) {
  int c = getchar();
  if (isdigit(c)) {
    vars[i++] = c - '0';
  } else if (!isspace(c)) {
    // error
    break;
  }
}

上述当然假设数字为'0'到'9'并且具有递增的连续值......并且每个都由单个char表示 - 但这些可能是安全的假设。

答案 3 :(得分:0)

在按下回车按钮后读取scanf时,可能更容易将该行作为字符串读取,然后尝试分析它。您可以在功能齐全的终端上使用退格键等更正您的输入,因此对于用户而言,它比getchar更舒适。 我们只寻找个位数,是吗?

可能是这样的:

char buffer[SOMECOUNT];
int digits[4];
int read, i;
scanf("%s", buffer);
for(int i = 0; i < strnlen(buffer, SOMECOUNT); ++i)
{
    if( read >= 4 )
         break;
    if( isdigit(buffer[i]) )
    {
         digits[read] = buffer[i] - '0';
         read++;
    }
 }
if ( read < 4 )
    printf(error...);

当然,这个SOMECOUNT常量使得解决方案对于讨厌的输入有点脆弱,所以你可能想要使用限制:scanf(“%20s”,buffer)甚至构造格式字符串以包含SOMECOUNT