Как мне изменить мой код, чтобы он использовал strtol () вместо scanf () для чтения только в первых двух целых? - PullRequest
0 голосов
/ 07 октября 2019

Мой текущий код работает нормально на DOS, но не на Unix, и мне нужно, чтобы он работал на обоих. Из того, что я нашел до сих пор, кажется, я должен использовать strtol (). Тем не менее, я не могу понять, как заставить strtol () получить только первые два целых числа.

Входные данные представляют собой текстовый файл, который выглядит следующим образом:

45x7
(1,0)
(10,2)

И янужен вывод: «Есть 45 строк и 7 столбцов».

Это мой текущий код:

int rows=0, columns=0;
scanf("%d%*c%d%*c", &rows, &columns);
printf("There are %d rows and %d columns.", rows, columns);
return 0;

Я не хочу сбрасывать оставшийся текстовый файл, так как мне также потребуется его обработать.

1 Ответ

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

Вот один из способов использования fgets и strtol. По общему признанию, это более многословно, чем решение scanf.

int rows=0, columns=0;
char *endp;
char firstline[100];
if(fgets(firstline, sizeof(firstline), stdin) == NULL) {
    fprintf(stderr, "premature EOF\n");
    exit(1);
}
rows = strtol(firstline, &endp, 10);
if(*endp != 'x') {
    fprintf(stderr, "syntax error\n");
    exit(1);
}
columns = strtol(endp + 1, &endp, 10);
if(*endp != '\n') {
    fprintf(stderr, "syntax error\n");
    exit(1);
}
printf("There are %d rows and %d columns.\n", rows, columns);

Ключ в том, что вторым аргументом strtol является указатель на указатель , который заполняетсяуказатель на первый символ strtol не использовал. То есть, когда вы передаете строку 45x7\n в первый вызов strtol, она возвращает 45 и устанавливает endp для указания на x.

...