我当前的代码似乎可以在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;
我不想丢弃剩余的文本文件,因为我也需要对其进行处理。
这是使用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
。