如何在C中接受这种类型的输入?

hfyxw5xn  于 2023-06-21  发布在  其他
关注(0)|答案(2)|浏览(100)

输入:
四五六七八
20
15
我需要接受一个整数数组。数组大小没有给出。我还想接受输入数组下面的两个整数值。如何在C语言中处理这类问题。

  • 代码:
int a[1001],x,y;
   int i=0;
   while(scanf("%d ",&a[i])==1){
   i++
   }
   scanf("%d\n%d",&x,&y);
ajsxfq5m

ajsxfq5m1#

将最多N int的行读入数组

  • 最好使用fgets()来读取用户输入的 * 行 *。避免scanf(),直到你知道为什么它是坏的。
  • 防御性编码将检测过长的行、int范围之外的值和非数字输入。建议为用户输入提供2倍大小的缓冲区。
  • 避免赤裸裸的魔术数字。
  • 要做好工作需要一些代码,但不要太多。
// UNTESTED ILLUSTRATIVE CODE

#include <stdio.h>
#include <stdlib.h>
#define ARRAY_N  1001
#define CHAR_PER_INT 11

// Return a number of `int`s read.
// Return -1 on error.
int read_1_line_of_ints(int n, int a[]) {
  // Form a buffer 2x enough for worse-case input.
  #define BUF_N (ARRAY_N * (CHAR_PER_INT + 1) * 2 + 1 + 1)
  char buf[BUF_N];
  if (fgets(buf, sizeof buf, stdin) == NULL) {
    return 0; // No input
  }
  const char *p = buf;
  int i = 0;
  while (*p) {
    char *end;
    errno = 0;
    long value = strtol(p, &end, 10);
    if (p == end) {|
      // No conversion
      if (*p == '\n') {
        break;
      }
      // Non numeric input
      return -1;
    }
    if (errno || value > INT_MAX || value < INT_MIN) {
      // Value out of int range
      return -1;
    }
    if (i >= n) {
      // Too many
      return -1;
    }
    if (*p - buf + 1 >= sizeof buf) {
      // We are too close to the end and 
      // may have failed to read in all the number.
      return -1;
    } 
    a[i++] = (int) value;
    p = end;
  }
  return i;
}

// Usage

    int n = sizeof a/sizeof a[0];
    int count = read_1_line_of_ints(n, a);

这处理了很多问题。有些人还没有做到:

  • 如何处理超过ARRAY_N的输入?
  • buf[BUF_N]还不够时怎么办?
  • 在最后一个值之后允许除'\n'之外的其他空白。
  • (总有几个)
    读取输入x, y

读入大小为1的数组,两次

read_1_line_of_ints(1, &x); 
read_1_line_of_ints(1, &y);

我明天会更深入地复习,并提供更多细节。

46qrfjad

46qrfjad2#

您正在使用while循环将值读入数组,而与实际值是否属于数组无关。你需要检查scanf是否匹配while循环中的输入结束,你还需要检查int值后面的字符是否是换行符或其他字符:

int a[1001],x = -1,y = -1,temp;
   char tempC = ' ';
   int i=0;
   while(scanf("%d%c",&temp, &tempC) == 2){
       if (tempC == '\n') {
           if (x == -1) x = temp;
           else y = temp;
       } else {
           a[i++] = temp;
       }
   }

相关问题