Семейство функций *scanf
не позволяет вам делать это изначально. Конечно, вы можете обойти эту проблему, считав минимальное количество элементов, которые, как вы знаете, будут присутствовать в каждой строке ввода, подтвердите возвращаемое значение *scanf
и затем продолжайте постепенно, по одному элементу за раз, каждый раз проверяя возврат значение для успеха / неудачи.
if (1 == fscanf(stream, "%d", &x) && (x == 'desired_value)) {
/* we need to read in some more : separated numbers */
while (2 == fscanf(stream, "%d:%d", &y, &z)) { /* loop till we fail */
printf("read: %d %d\n", y, z);
} /* note we do not handle the case where only one of y and z is present */
}
Лучше всего справиться с этим, прочитав строку, используя fgets
, а затем проанализируйте строку самостоятельно, используя sscanf
.
if (NULL != fgets(stream, line, MAX_BUF_LEN)) { /* read line */
int nitems = tokenize(buf, tokens); /* parse */
}
...
size_t tokenize(const char *buf, char **tokens) {
size_t idx = 0;
while (buf[ idx ] != '\0') {
/* parse an int */
...
}
}