我如何修改代码以使用strtol()而不是scanf()来仅读取前两个int?

问题描述 投票:0回答:1

我当前的代码似乎可以在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;

我不想丢弃剩余的文本文件,因为我也需要对其进行处理。

c matrix int scanf strtol
1个回答
0
投票

这是使用fgetsstrtol的一种方法。公认的是,它比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

© www.soinside.com 2019 - 2024. All rights reserved.