【问题标题】:command line arguments issues命令行参数问题
【发布时间】:2015-10-17 03:10:50
【问题描述】:

目前程序正在读取“无法打开输入文件”,这意味着大小为 0。我用我的编辑器制作了输入文件,但我不确定问题可能是什么。我的代码有什么问题可能导致这种情况吗?还是更有可能我只是弄乱了 input.txt 文件?

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

int load_data(char* filename, int *x, float *y)
{
    int i=0;

    FILE* file=fopen(filename,"r");


    if(file==NULL)
    {
            return 0;
    }

    int size;


    fscanf(file, "%d", &size);

    for(i=0;i<size;i++)
    {
            fscanf(file, "%d%f", &x, &y);
    }


    fclose(file);
    return size;
}


void print_data(int *acn, float *amt, int size)
{
    int i;
    int *p;

    for(i=0;i<size;i++)
    {
            printf("%-10d%-10f ", *(acn+i), *(amt+i));
    }
}

int main(int argc, char** argv)
{
    int size=0, *x;
    char *filename;
    float *y;

    if(argc!=3)
    {
            printf("\nInsufficient arguments.\n");
            return 0;
    }


    int n=atoi(argv[2]);

    int *acn;
    float *amt;


    int *fp=malloc(sizeof(int)*n);


    if(size==0)
    {
            printf("\nUnable to open the input file.\n");
            return 0;
    }
    load_data(filename, x, y);
    print_data(acn, amt, size);

    free(fp);
    return 0;
}

【问题讨论】:

  • main 中的size 变量与其他函数中的size 变量不同。 main 中的 size 在初始化为 0 后永远不会设置。当您在其他函数中设置 size 时,您的 main 不会看到。
  • 你作为命令行参数传递什么值?

标签: c command line argv argc


【解决方案1】:

你的程序有很多问题-

  1. 您是逗号中的文件名,但您没有将其存储在char *filename; 和函数int load_data(char* filename, int *x, float *y) 中 您正在传递filename。但filename 中没有存储name of file
  2. fscanf(file, "%d%f", &amp;x, &amp;y); 当你用%dfscanf 中传递指针时,你不需要&amp; 操作符。这样就可以了-

    fscanf(file, "%d%f", x, y);
    
  3. 您需要使用 malloc 将内存分配给 xy

  4. 两个函数中的size 是不同的,因为你在函数和main 中再次声明它。这就是为什么sizeint main 中总是0

  5. void print_data 在此函数中,您正在打印 acnamt 的值,但两个指针都未初始化并且您正在打印它,因此它会给出未定义的行为。

  6. 你也有在你的程序中声明但未使用的指针。

【讨论】:

  • 1.我不确定你在这里的意思。文件名应该用引号引起来吗? 2.嗯,我得到了一个没有 & 的错误。 3. 这看起来像 int *fp=malloc(sizeof(intx, int y)*n); ? 4. 是的,程序应该读取一个输入文件并从那里确定大小,但我还没有完全理解这一点。我在这个概念上有点挣扎。 5. 哦,那我只需要先初始化acn和amt,那么呢?明白了。谢谢! 6. 我会留意那些。谢谢!
  • @Joe 看你在命令行中取文件名。所以你的文件名存储在argv[1] 所以你需要在char *filename 中获取它。因为在fopen 中你传递了filename char 指针这是空的。我不明白为什么不使用&amp; 时会出错,因为xy 已经是integer pointers,所以你不需要&amp;
  • @Joe int *fp=malloc(sizeof(intx, int y)*n); 这会将内存分配给fp 而不是xy
【解决方案2】:

在以下代码行(您已发布)中,size 变量的值为0。在检查if(size==0) 行之前,该值从未更新过。这就是为什么这个if 检查返回true 并打印"Unable to open the input file"

您可能希望在此if 检查之前设置size 变量的值。

int size=0, *x;    //HERE YOU ARE WRITING "SIZE" VARIABLE
char *filename;
float *y;

if(argc!=3)
{
        printf("\nInsufficient arguments.\n");
        return 0;
}

int n=atoi(argv[2]);
int *acn;
float *amt;

int *fp=malloc(sizeof(int)*n);
if(size==0) //HERE YOU ARE READING/CHECKING "SIZE" VARIABLE. THERE IS NO CHECGE IN VARIABLE BEFORE THIS SO, VALUE IS STILL '0'
{
        printf("\nUnable to open the input file.\n");
        return 0;
}

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    相关资源
    最近更新 更多