【发布时间】:2019-10-07 09:20:39
【问题描述】:
我当前的代码在 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;
我不想丢弃剩余的文本文件,因为我也需要处理它。
【问题讨论】:
-
not on Unix- 它是如何“不工作”的?my current code- 你缺少int main() {和#include <stdio.h>和}。在我修复你的代码之后,我得到了你为你指定的输入指定的输出。 -
将
\n附加到printf。 -
在 Linux (Mint 19) 上运行代码可以正常工作。输入文件是否可能有 BOM、Unicode 或类似文件?
-
大概你的
scanf调用中的"%d%*c%d%*c"应该读取一个int,跳过x,读取另一个int,然后跳过\n。如果有什么我希望这在 DOS 或 Windows 下会有更多问题(其中行以\r\n终止,尽管在文本模式下这无关紧要)。在任何情况下,您都可以考虑其他技术。我的第一个建议是%dx%d明确匹配x,并检查scanf的返回值以确保它是2。 -
许多人(包括我自己)建议避免使用
scanf,而strtol通常是替代方案的一部分——但只是一部分。第一步通常是使用fgets或类似的方法准确地阅读行 的文本。然后,您可以 (a) 通过调用sscanf解析该行,或 (b1) 通过调用strtol或类似方法(此处使用'x'分隔符)和 (b2) 将行分解为“字段” ) 在每个字段上调用 strtol之类的东西,或者 (c) 使用各种其他临时解析技术。