【问题标题】:C Reading file and keep numbers in an arrayC读取文件并将数字保存在数组中
【发布时间】:2017-02-18 05:14:43
【问题描述】:

我是 C 初学者。

我需要读取一个文件并将数字保存在一个数组中。我尝试了 for 循环和 while 循环,但无法创建正确的条件。每次循环遇到文件中的空行时,我都会得到一个零数组。

我尝试使用临时变量来分配值,然后将其传递给数组。并尝试将值直接传递给数组。

我的代码:

for (i = 0; i < (num_pt + 1);)
{
   fgets(line, 50, fp);
   if (sscanf(line,"%d%d", &tempx, &tempy))
   {
       x_cr[i] = tempx;
       y_cr[i] = tempy;

       printf("%d %d\n", x_cr[i], y_cr[i]);
    }
    i++;
}

【问题讨论】:

  • 可以显示输入格式吗?你可能不需要使用fgets
  • if (sscanf(line,"%d%d", &amp;tempx, &amp;tempy)) 需要为 if (sscanf(line,"%d%d", &amp;tempx, &amp;tempy) == 2),因为 scanf 系列函数返回成功转换的参数数量。
  • 我会说for (i = 0; i &lt; (num_pt + 1);) 应该是for (i = 0; i &lt; num_pt; i++) 并删除循环中的最后一个i++ - 这是使用for 循环的常用方法。我只是在猜测更改结束条件,因为您没有发布足够的代码,但是如果例如num_pt 是点数和元素数,在x_cr[]y_cr[] 然后索引x_cr[num_pt]将超出数组的范围。
  • 此外,i &lt; (num_pt + 1) 的风格很差,写起来很混乱,因为大脑(和编译器)必须执行额外的步骤。如果这真的是结束条件,惯用且清晰的方式是i &lt;= num_pt,这样更容易阅读,也更容易发现错误。
  • 您应该只在向数组添加条目后增加i,而不是每行。

标签: c arrays loops parsing while-loop


【解决方案1】:

请注意,您对sscanf() 的调用可能会返回EOF012,并且只有当结果为2 时才能安全使用tempxtempy.

考虑这个示例代码:

#include <stdio.h>

int main(void)
{
    int x;
    int y;
    char *str[] = { "", "a", "1 a", "1 2" };
    enum { NUM_STR = sizeof(str) / sizeof(str[0]) };
    for (int i = 0; i < NUM_STR; i++)
    {
        int rc = sscanf(str[i], "%d %d", &x, &y);
        printf("rc = %2d for [%s]\n", rc, str[i]);
    }
    return 0;
}

在 macOS Sierra (10.12) 上运行时,输出为:

rc = -1 for []
rc =  0 for [a]
rc =  1 for [1 a]
rc =  2 for [1 2]

所以,你的支票应该是:

if (sscanf(line,"%d%d", &tempx, &tempy) == 2)

您的另一个问题是i++ 应该在这个if 条件的主体内;你应该只在添加数据时增加i

【讨论】:

    猜你喜欢
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多