【问题标题】:Iterating i to print file name迭代 i 以打印文件名
【发布时间】:2017-10-02 02:46:57
【问题描述】:

代码的要点是提示用户输入 max_x、max_y 值、点数和要创建的文件总数。从这里创建一个文件,文件中输入的代码可以正常工作。

这就是我想要达到的目标:

假设用户输入是:

生成随机实例 ...

输入电路板尺寸MAX_X MAX_Y: 100 200

输入点数NUM_PT:10

输入要生成的随机实例数:7

我被卡住的地方是程序不会迭代 7 次,而是只创建一个名为 instance7_007.txt 的文件

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[]) {
    FILE *fp;
    int max_x, max_y, num_pt, random_inst;
    int MAX_LEN = 200;
    int *x_coordinate, *y_coordinate;
    int inputfile = 0, outputfile = 0;
    int i;
    char name[MAX_LEN];

      if (argc == 1) {
        /* to generate random instances, accepting parameters from stdin */
        printf("Generating random instance . . .\n");
        printf("Enter the circuit board size MAX_X  MAX_Y: ");
        scanf("%d%d", &max_x, &max_y);
        printf("Enter the number of points NUM_PT: ");
        scanf("%d", &num_pt);
        printf("Enter the number of random instances to be generated: ");
        scanf("%d", &random_inst);
        for (i=1; i < random_inst; i++);
        {
          snprintf(name, MAX_LEN, "instance%d_%03d.txt", num_pt, i);
          fp = fopen(name, "w");
          printf("%s generated", &name);
          fprintf(fp, "#%s\n", argv[inputfile]);
          fprintf(fp, "area [0, MAX_X] x [0, MAX_Y]\n");
          fprintf(fp, "%d\t%d\n", max_x, max_y);
          fprintf(fp, "%d\n", num_pt);
          fprintf(fp, "#coordinates\n");
          for (i=0; i < num_pt; i++)
          {
            fprintf(fp, "%d\t%d\n", rand()%max_x, rand()%max_y);
          }
          fprintf(fp, "#end of instance\n");
          fclose(fp);
        }
        return 1;
        }
}

【问题讨论】:

  • 也没有出现编译错误,所以我很茫然。
  • edit你的问题告诉我们你做了什么样的调试。我希望您已经在 Valgrind 或类似的检查器中运行了您的minimal reproducible example,并使用诸如 GDB 之类的调试器进行了调查。确保您也启用了全套编译器警告。这些工具告诉了你什么,它们缺少什么信息?并阅读 Eric Lippert 的 How to debug small programs

标签: c


【解决方案1】:

你的程序只迭代一次的原因是你在内部循环中覆盖了你的循环变量。在外部和内部循环中,您使用范围为main - i 的相同变量。一种解决方法是添加另一个循环变量(即最初的 int i, j)并将内部循环更改为:

for (j=0; j < num_pt; j++)
{
    fprintf(fp, "%d\t%d\n", rand()%max_x, rand()%max_y);
}

或者,您可以通过在循环语句中声明 is 来将它们的范围缩小到它们各自的循环,

for (int i=1; i < random_inst; i++)

for (int i=0; i < num_pt; i++)

这种方法实际上很有用,可以避免某些错误。

另一个问题是@user501138 指出,你的外循环有一个; 导致循环体为空。还有,这一行

printf("%s generated", name);

在原始代码中不正确,因为它具有 &amp;name 而不是 name,它表示指向 char 数组的指针而不是指向 char 数组的指针。我建议您启用编译器警告,因为我的编译器已经指出了这两点。

最后,不需要argc==1 检查,至少对我来说不是一个明显的 - argc 将始终至少为 1 - argv 将始终有一个参数 - 你正在运行的程序的名称跑步。您当然可以将其保留在那里,通过上述更改,您的程序可以按预期工作。

【讨论】:

  • 谢谢,这很有帮助。不知道放置的后果;在 for 的末尾。
  • 很高兴为您提供帮助。这样想 - 你知道循环语句后不需要大括号,在这种情况下,循环体被认为是它后面的一行/语句。在这种情况下,它只是;,它实际上算作一个声明。看看你的循环变量替代品的小添加,它可能会很有用。
【解决方案2】:

删除 for() 循环语句末尾的分号。您的循环实际上没有执行。

【讨论】:

  • 不幸的是,这没有成功,真的和这个混​​淆了
猜你喜欢
  • 2011-04-05
  • 1970-01-01
  • 2017-11-05
  • 2019-04-01
  • 1970-01-01
  • 2016-12-21
  • 2015-02-27
  • 2022-12-06
  • 1970-01-01
相关资源
最近更新 更多