c malloc更改char指针

时间:2016-04-09 15:33:48

标签: c pointers

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:

1 个答案:

答案 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表示成功,其他任何内容都失败)。您需要更改代码以相应地检查错误。