1

これは大まかなコードなので、まだ free(s) はありません。リンクされたリストがどこで台無しになっているのかを突き止めようとしています。

次の関数の目的は、次のようなものを受け入れることです。

add 1 2

また

add 1 "some quote" maybe more stuff

要素でリンクされたリストを作成します..最初のケースでは:

[add]->[1]->[2]

2 番目のケース:

[add]->[1]->["some quote" maybe more stuff]

「カウント/合計」が出力にあるため、実際にステップを実行していることがわかります。ただし、リンクされたリストを反復しようとすると、最初の要素のみが出力されます。

typedef struct command{
    char* args;
    struct command *next;
}command;
typedef struct commands_list{
    command *head;  /*Start of the queue*/
    int total;  /*Total commands passed*/
}commands_list;

commands_list* process_command(char *command){
    char curr_char;                 /*Keeps track of current character*/
    int start_pos;
    int i;
    int len;    

    /*Length of user input*/
    int quote=0;
    int empty =1;
    commands_list *commands;
    struct command *conductor;

    len = strlen(command);              /*Calculate length*/    
    /*Initialize the List*/
    commands=malloc(sizeof(commands_list));         /*Allocate memory for the linked list*/
    commands->head = malloc(sizeof(struct command));
    conductor = commands->head;

    for(i=0,start_pos=0;i<strlen(command);i++){
        curr_char = command[i];
        if (empty==0){
            conductor = malloc(sizeof(struct command));
        }
        if (curr_char == ' '){      /*If there was a space found copy the stuff before the space*/
            if ( i>0 && command[i-1]==' ') {
                start_pos++;
                continue;
            }
            conductor->args = malloc(i-start_pos+1*(sizeof(char))); /*Allocate memory for the word to be copied*/
            strncpy(conductor->args,command+start_pos,i-start_pos); /*Copy the word/command to the memory allocated*/
            conductor->args[i-start_pos+1]='\0';            /*Add null terminator at end*/
            commands->total++;              /*Increase total # of commands*/
            conductor=conductor->next;          /*Conductor points to the first element now*/
            start_pos =i+1;
            if (empty==1){
                empty=0;
            }
        }
        else if (curr_char == '\"'){        /*If a quote was found, copy the rest of the string and exit loop*/
            conductor->args = malloc(len-i+1*(sizeof(char)));
            strncpy(conductor->args,command+i,len-i);
            conductor->args[len-i+1]='\0';
            conductor->next=NULL;
            commands->total++;
            quote=1;
            //empty_queue = 0;
            conductor = conductor->next;
            if (empty==1){
                empty=0;
            }
            break;
        }
    }
    if (quote==0){                  /*If there was no quote in the string, get the last element*/
        if (empty==0){
            conductor = malloc(sizeof(struct command));
        }
        conductor->args = malloc(len-start_pos+1*(sizeof (char)));
        strncpy(conductor->args,command+start_pos,len-start_pos);
        conductor->args[len-start_pos+1]='\0';
        conductor->next=NULL;
        commands->total++;
    }   /*Finish find quote*/
    printf("%d commands found\n",commands->total);
    //free(conductor);
    return commands;    
}

そして、リンクされたリストを印刷するために使用している一時的な方法:

int print_list(commands_list **headNode){
    commands_list *top = *headNode;
    struct command *temp = top->head;           /*Temporary variable for command*/
    while(temp!=NULL){
        printf("I was here to print: [%s]\n",temp->args);
        temp = temp->next;
    }
    printf("It was all null\n");

    free(temp);
}

ありがとう

4

2 に答える 2

1

next最初の要素のみを出力する場合は、最初の要素のメンバーが NULL であると結論付けなければなりません。conductorが割り当てられますconductor->nextが、conductor->nextそれ自体には NULL 以外が割り当てられることはありません。

末尾に追加する場合next、現在の末尾のメンバーに新しいアイテムのアドレスを割り当てる必要があります。それが起こっているようには見えません。

このコードを分析するには、シンボリック デバッガーを使用することを強くお勧めします。変数の状態を監視しながら、各行をステップ実行できます。

于 2012-07-08T08:21:35.500 に答える
1

コードには、デバッグを困難にする多くの問題があります。

主な問題は、構造体コマンド * をリストの最後に追加する方法です。この線

        conductor=conductor->next;

コンダクターを NULL (または malloc が行ったもの) に割り当てるだけです。Conductor-> next を何かに割り当てることはありません。

新しい構造体コマンド * を malloc する場合、古いコンダクターを更新する必要があります->新しく割り当てられた要素の隣。したがって、代わりに:

        conductor = malloc(sizeof(struct command));

次のようなものが必要です:

        struct command *tmp = malloc(sizeof(struct command));
        conductor->next = tmp;
        conductor = tmp;

また、行 Conductor->args = " not allocated yet #1 ";を追加すると、デバッグに役立つ場合があります。上記の最後の行の後。これはひどいものであり、製品コードには表示されませんが、問題のデバッグに役立ちます。

于 2012-07-08T08:38:58.767 に答える