c - 从文件读入 *argv[] 数组

标签 c program-entry-point argv

我尝试将 C 语言的 Linux 程序转换为 DOS。由于 DOS 命令行只允许 128 个字节,我尝试从文件中读取参数。该文件的每个参数一行。

所以我将文件中的参数读入一个字符串数组,并想用我的字符串数组的地址覆盖 *argv[] 地址。

但是我对指向指针的指针感到困惑。我应该怎么做才能正确覆盖函数中的 *argv[] 地址?

这个程序用“argvtest.exe commands.dat”调用

这是我的测试代码:

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

void read_cmd_file(int *argc,char *argv[]){

    if (*argc != 2 ) return;

    char buf[256];
    char arguments[30][256];
    int line_nr=0,i;

    FILE *fp=(FILE *) NULL;

    /* open the file */
    fp=fopen(argv[1],"r");
    if (fp == (FILE *) NULL)
    {
        printf("Could not open command file: %s",argv[1]);
        return;
    }

    while (fgets(buf,sizeof(buf)-1,fp) && !feof(fp))
    {

        line_nr++;
        strcpy(arguments[line_nr],buf);
        //printf("Argument read: %s\n",buf);
    }

    if (fp != (FILE *) NULL)
        (void) fclose(fp);

    for (i=1;i<=line_nr;i++) printf("%d,%s\n",i,arguments[i]);

    *argv=&arguments[0][0];
    *argc=line_nr;

    return;

}

int main(int argc,char **argv)
{
    int i;
    read_cmd_file(&argc,argv);
    printf("argc=%d\n",argc);
    for (i=0;i<argc;i++) printf("%d,%s\n",i,argv[i]);
}

最佳答案

有两件事你应该做。首先,您需要一个指向指针的指针:

void read_cmd_file(int *argc,char ***argv)
{
    ...
    fp=fopen((*argv)[1],"r");
    ...
    *argv = result;
}

...
read_cmd_file(&argc,&argv);

然后,您永远不要尝试从函数返回对局部变量的引用:在您的代码中

*argv=&arguments[0][0];

是邪恶的标志,不得使用...

相反,您必须在函数中分配内存,然后在使用后释放它。像这样的东西:

void read_cmd_file(int *argc,char ***argv)
{
    char **arguments;

    ...
    arguments = calloc(30, sizeof(*arguments)); // 30 args
    ...
    while (fgets(buf,sizeof(buf)-1,fp) && !feof(fp))
    {
        line_nr++;
        arguments[line_nr] = strdup(buf); // allocates memory on heap
    }
    ...
    *argv=arguments;
}

...
int main(int argc,char **argv)
{
    int i;
    read_cmd_file(&argc,&argv);
    for (i=0;i<argc;i++) printf("%d,%s\n",i,argv[i]);
    ...
    for (i = 0; i <argc; i++)
    {
        free(argv[i]);
    }
    free(argv);
}

关于c - 从文件读入 *argv[] 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15860628/

相关文章:

java - 为什么我可以从 main 方法访问私有(private)变量?

java - 为什么需要 `String[] args` 作为 main() 参数?

python - Python 'sys.argv' 是否有参数的最大数量限制?

perl - 在 Perl 中读取输入文件并将其放入带有空格分隔符的数组中

C 从命令提示符中获取参数作为条件

c - 从文件中读取数据到结构体数组 (C)

c++ - CUDA tex1Dfetch() 错误行为

java - Eclipse:主函数存在时出现 "selection does not contain a main type"错误

c - C. Break、Switch、If 中的愚蠢错误。 1990年电话网络崩溃

c - 如何从 gcc 限制 C 指令集