我必须在不同的坐标中读取并将它们保存到结构中对于这个任务我只能用

#include <stdio.h>
#include <stdbool.h>

把它读进去我还必须使用GCC编译器。
对于一个结构,我需要4个坐标,因此插入可以如下所示:
Coordinates: 11 12 13 14 21 22 23 24
//           | First   |  | Second |

对于读入,我有以下结构:
int read() {
    int a;
    scanf("%d",&a);
    return a;
}

主要:
printf("Coordinates: ");
int buffer = read();
while(buffer != 0) {
    //write current buffer in struct
    ...
    buffer = read();
}

所以问题是,使用这种结构,插入需要以scanf结尾。但我的任务是,当不再有“四人组”坐标时,读入过程结束。
例如:
Coordinates: 11 12 13 14 21 22 23 24 31
//            | First  |  | Second |  invalid -> while loop ends

所以我不知道如何取消while循环,因为我不知道用户将输入多少坐标。
允许的库功能:0
我希望你们中有人能理解我并帮助我。

最佳答案

OP的代码无法区分读取a"0"和遇到错误它不会记录4个数字中读取了多少。它不会检测前缀"Coordinates:"

int read() {
    int a;
    scanf("%d",&a);
    return a;
}

读“四包”,一次读一个四包。
struct pt4 {
  int i[4];
};

// Return EOF, 0, 1, or 4
struct pt *Read_foursome(struct pt4 *fourpack, int count) {
  // Look for prefix
  if (count == 0) {
    // Record number of characters read
    int n = 0;
    if (scanf(" Coordinates:%n", &n) == EOF) return EOF;
    if (n == 0) return 1; // Unexpected data, prefix not exactly there.
  }
  // record the number of fields successful scanned.
  int n = scanf("%d%d%d%d",
      &fourpack.i[0], &fourpack.i[1], &fourpack.i[2], &fourpack.i[3]);

  // No more data
  if (n == EOF) return EOF;

  // no numeric  data
  if (n == 0) return 0;

  // Unexpected data
  if (n != 4) return 1;

  // As expected
  return 4;
}

示例用法
int n;
int count = 0;
struct pt4 fourpack;
printf("Coordinates:");
while ((n = Read_foursome(&fourpack, count)) == 4) {
  // Use fourpack
  printf(" %d %d %d %d",
      fourpack.i[0], fourpack.i[1], fourpack.i[2], fourpack.i[3]);
  count++;
}
printf("\n");

// If n == 0 maybe time to look for another line of fourpack
// If n == 1, some syntax error in the line.

09-08 00:02