我尝试将 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/