int main(int argc, char **argv){
if(argc<2){
printf("No file to read specified\n");
return EXIT_FAILURE;
}
FILE *fileToRead=fopen(argv[1],"r");
if(fileToRead==NULL){
printf("File couldn't be opened! Are you sure it exists and you have the permissions to read?\n");
return EXIT_FAILURE;
}
char *lineRead=malloc(sizeof(char)*MAX_LINE_LENGTH);
char *search=" ";
while((lineRead=readLine(fileToRead))!=NULL){
if(lineRead[0]=='#'){
printf("Comment at: %s\n",lineRead);
}else if(lineRead[0]=='\0'){
printf("Comment at: %s\n",lineRead);
} else {
printf("linebef: %s ",lineRead);
char *command,*args,*tmpArg;
command=strtok(lineRead,search);
args=malloc(sizeof(char)*(strlen(lineRead)));
args[0]='\0';
while((tmpArg=strtok(NULL,search))!=NULL){
args=strcat(args,tmpArg);
args=strcat(args," ");
}
printf("line: %s, comm: %s, args: %s\n",lineRead,command,args);
free(args);
//TODO execv
}
}
free(lineRead);
return EXIT_SUCCESS;
}
这是我的主要计划。它会打开一个文件并逐行读取。如果行的beginnig中有#或空格,则程序继续到下一行。如果不是我想根据&#34;解析我的行。 &#34;空间。该程序的目的是在命令行中执行程序行。
问题是当我在args中使用malloc时它会以某种方式操纵我的lineRead变量,然后它指向一个错误的值。第一个&#34;之前的第一个字符串&#34;以某种方式被删除(我认为指针只是增加?)。
# This is a comment followed by an empty line
/usr/bin/whoami
/bin/echo hello world
/bin/false
/usr/bin/id &
/bin/date
这是我的示例文件。 有没有人在这看到我的问题?
这是我的输出:
Comment at: # This is a comment followed by an empty line
Comment at:
linebef: /usr/bin/whoami line: , comm: , args:
linebef: /bin/echo hello world line: /bin/echo, comm: /bin/echo, args: hello world
linebef: /bin/false line: /bin/false, comm: /bin/false, args:
linebef: /usr/bin/id & line: /usr/bin/id, comm: /usr/bin/id, args: &
linebef: /bin/date line: /bin/date, comm: /bin/date, args:
答案 0 :(得分:0)
问题在于:
while((lineRead=readLine(fileToRead))!=NULL){
...
将lineRead分配给readLine返回的新值。检查readLine函数以查看数据的返回方式。 readLine的常见实现应该是:
char * readLine(FILE *fileToRead, char *lineRead) {
// Read data into lineRead
// if read failed, returned NULL, else return lineRead
}
请注意,您还可以更改readLine的返回值以返回整数(0表示成功,其他任何内容都失败)。您需要更改代码以相应地检查错误。