通过 scanf 检查输入是否正确

Check for correct input via scanf

我有一个整数 'n' 负责稍后输入的数字数量。 我需要在这里检查是否有任何不正确的输入。 'n' 的第一个 scanf 工作正常,但第二个有一些缺陷。 案例如下:

n = 3(例如)- 没关系

那我要scanf: 1 2 3 4

它将扫描前 3 个值,但我需要抛出一个错误。

同样适用于:1 2 3.5 -(最后一个数字是浮点数,但它仍然是 3)

并带有一个字符:1 2 3g

if (scanf("%d", n) == 1 && getchar() == '\n') {
        if (n > NMAX || n < 0) {
            error = 1;
            return;
        }
        for (int i = 0; i < n; i++) {
            if (scanf("%d", p) == 1) {

唯一正确的输入是在 for 循环中扫描完全相同数量的整数(等于 'n')。

UPD:我只能使用 <stdio.h> 库以及 scanf.

创建辅助函数来读取 int 并验证它。

关键是要验证输入,形成一个辅助函数,您可以根据需要进行改进,例如使用 fgets() 而不是 scanf() 一旦可怜的“仅 scanf” 要求被删除。

// Sample
// Return 1 on success
// Return EOF on end-of-file
// Else return 0
int read_int(int *i, int min, int max, int line) {
  long long num;
  int result = scan("%18lld", &num);  // Accept many out of int range input
  if (result == EOF) return result;  // or if (result < 0)

  if (line) {
    // consume the rest of the line
    int ch;
    while ((ch = getchar()) != '\n' && ch != EOF) {
      if (!isspace(ch)) { // or `ch != ' ' && `ch != '\t' && ...
        result == 0; 
      }
    }
  }

  if (result == 1) {
    if (num < min || num > max) {
      return  0; 
    }
    *i = (int) num; 
  }

  return result;
}
    

示例用法

if (read_int(&n, 0, NMAX, 1) != 1) {
  error = 1;
  return;
}
for (int i = 0; i < n; i++) {
  if (read_int(&p, INT_MIN, INT_MAX, i + 1 == n) != 1) {
    error = 1;
    return;
  }
  ...

注意:read_int() 不会捕获所有错误,只能捕获其中的许多错误。一旦了解了 OP 的所有限制和目标,就很容易改进。

检查这是否有效

while(n-1)
{
    scanf("%d ",p);
    n-=1;
}
scanf("%d",p);
//After this you can scan again to check if there is anything extra in input
//and throw error accordingly

尝试将扫描集与 scanf 一起使用。 %1[\n] 最多扫描一个换行符。 %99[ \t] 将扫描最多 99 个字符,即 space 或制表符。如果字符不是换行符、space 或制表符,它将在输入流中被替换。
如果 scanf%d 不能扫描一个 int,它将 return 0scanf 也可以 return EOF.
fgets 并用 strtol 或其他解析是更好的解决方案。

#include <stdio.h>

int main ( void) {
    char space[100] = "";
    char newline[2] = "";
    int number = 0;
    int count = 0;
    int quantity = 3;

    printf ( "enter %d integers\n", quantity);
    while ( 1) {
        if ( 1 == scanf ( "%d", &number)) {
            ++count;
        }
        else {
            printf ( "could not parse an integer\n");
            break;
        }
        scanf ( "%99[ \t]", space);
        if ( 1 == scanf ( "%1[\n]", newline)) {
            if ( count == quantity) {
                printf ( "scanned %d integers\n", quantity);
                break;
            }
            else if ( count > quantity) {
                printf ( "too many integers\n");
                break;
            }
            else printf ( "enter another integer\n");
        }
    }
    return 0;
}