【问题标题】:How do I modify my code to use strtol() instead of scanf() to read in first two ints only?如何修改我的代码以使用 strtol() 而不是 scanf() 仅读取前两个整数?
【发布时间】: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) 使用各种其他临时解析技术。

标签: c matrix int scanf strtol


【解决方案1】:

这是使用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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多