Как читать этот формат - PullRequest
       13

Как читать этот формат

0 голосов
/ 18 октября 2019

Предположим, у меня есть такой ввод, по одной ячейке в каждой строке:

[0,0]
[0,2]
[0,4]
[2,4]
[4,4]

Мне удалось прочитать их один за другим, используя что-то вроде [%d,%d], и получить вывод вроде:

cell1: row: 0, col:0
cell1: row: 0, col:2

тогда у меня есть другой ввод, подобный этому

[0,0]->[0,1]->
[0,2]->[0,3]->
[0,4]->[1,4]->
[2,4]->[3,4]->
[4,4]->[5,4]

Как мне прочитать ввод, не прерываясь стрелкой '->'?

Ответы [ 3 ]

5 голосов
/ 18 октября 2019

Ладно, быстрое и дешевое решение: отсканируйте все до открывающей скобки и не волнуйтесь, что это такое. Затем отсканируйте фактические данные. Повторить.

int x, y;

scanf("%*[^[]");            // ignore everything up to the first [

while (scanf(" [%d ,%d]", &x, &y) == 2) {
    printf("[%d, %d]\n", x, y);

    scanf("%*[^[]");        // ignore stuff between ] and [
}
0 голосов
/ 18 октября 2019

Если я вас правильно понимаю, у вас есть строки ввода, например

[0,0]
[0,2]
[0,4]

, и вы успешно читаете их, используя вызов fscanf, например

fscanf(ifp, " [%d,%d]", &row, &col);

Если это так, иесли у вас есть другой формат ввода

[0,0]->[0,1]->
[0,2]->[0,3]->
[0,4]->[1,4]->

, почему вы не можете просто использовать что-то вроде

fscanf(ifp, " [%d,%d]->[%d,%d]->", &row1, &col1, &row2, &col2);

Полагаю, вы также можете использовать

fscanf(ifp, " [%d,%d]->", &row, &col);

, чтотребуется два вызова для чтения каждой строки.

PS Обязательные scanf напоминания:

  1. Не забудьте всегда проверять возвращаемое значение из scanf и fscanf, чтобы сделатьуверен, что ожидаемые входные данные были сопоставлены. (Я явно не смог последовать этому совету во фрагментах кода в этом ответе.)

  2. Хотя часто кажется, что вещь, которую следует использовать, fscanf - этообычно плохой инструмент для работы, и это может быть больше проблем, чем стоит заставить его делать то, что вы на самом деле хотите. Вы можете рассмотреть возможность использования альтернатив .

0 голосов
/ 18 октября 2019
"[%d,%d]->"

Используйте один пробел в строке формата, чтобы пропустить любое количество пробелов (включая символ новой строки ...) при вводе.

...