0

リンクリストに引数を渡す際に問題が発生しました。ユーザー入力を待ってから、このユーザー入力を解析し、解析したトークンを動的配列に入れます(char ** cmd)

その後、特定のユーザー入力をリンクリストに書き込む必要があります(たとえば、cmd [1]をリンクリストに渡す必要があります)。このプロセスは、ユーザーが「exit」に入るまでwhileループで繰り返されます(したがって、ユーザーは別の入力を求められます)入力してから、もう一度解析する必要があります)

しかし、最初のループ(ユーザーが入力を入力した後、それを解析してcmd[1]とcmd[2]をリンクリストに送信)の後、文字列の解析を繰り返してから、cmd[1]とcmd[2]をに送信します。リンクリスト。ただし、リンクリストは以前のすべての値を新しい値に上書きしてから、新しいノードに新しい値を追加して、すべてのノードが同じ値になるようにします。私はcか月前に学習を始めたばかりなので、このリンクリストをc ++で記述し、変換後にいくつかの間違いが発生する可能性がありますが、ポインタまたはリンクリストに問題がある可能性があります。また、動的配列からではなく通常の引数を渡すだけでリンクリストをテストしましたが、正常に機能しているようです。

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

//struct for environmental variables and thier values
struct ListNode
{
    //variable and value in the node
    char *var,*value;
    struct ListNode* next;//point to the next node
};
struct ListNode* head;//pointer to the head
// head = malloc(sizeof(struct ListNode));

void printList();
void appendNode(char *v, char *val);

int main(int argc, const char * argv[])
{
    char user_input[20]={0};

    int i=0;
    char c;

    int count=0;//keep count of words the user entered

    char ** cmd  = NULL;//create pointer and set it to NULL
    int size = 0;


    while (strcmp(user_input, "exit") != 0)//check if exit was typed into cmd line, if so then exit
    {

        //input three words separated with space
        scanf("%50[^\n]", user_input);//scan user input 


        size=0;
        count=0;
        const char delimiters[] = " !-";//create an array of delimiters to use to separate string

        char *ptr = strtok (user_input, delimiters);

        cmd = malloc(sizeof(char));//allocate memory for pointer cmd

        while (ptr)//split string into tokens to " !-"
        {
            cmd = realloc (cmd, sizeof(char*)*(++size));//reallocate more memory for an array

            if (cmd == NULL)
                exit (-1); // memory allocation failed

            cmd[size-1] = ptr;

            ptr = strtok (NULL, delimiters);

            count++;//count words in the input
        }


        cmd = realloc (cmd, sizeof(char*)*(size+1));// realloc one extra element for the last NULL
        cmd[size] = 0;

        for (i = 0; i < (size+1); ++i)
            printf ("cmd[%d] = %s\n", i, cmd[i]);


         //free(cmd);//free memory


        while((c = getchar()) != '\n' && c != EOF); //flush buffer


        if (count==3 )//set environmental variable

            {

                appendNode(cmd[1], cmd[2]);
            }
        printList();

    }
     free(cmd);
    return 0;
}


void appendNode(char *v, char *val)
{
    struct ListNode* newNode;//to point to new node
    struct ListNode* nodePtr = NULL;//to move through the list

    //allocate new node and store int there
    newNode = malloc (sizeof( struct ListNode));
    newNode->var=v;//put value of v into new variable
    newNode->value=val;//put value of val into new value
    newNode->next = NULL;
    //if there are no nodes in the list make new node th efirst node
    if(!head)
    {
        head = newNode;

    }
    else
    {
        //initialize nodePtr to head
        nodePtr = head;
        //find the last node in the list
        while (nodePtr->next)
        {
            nodePtr = nodePtr->next;
        }
        //insert new node as the last node
        nodePtr->next = newNode;
    }

}
void printList()
{
    struct ListNode* nodePtr = head; //position nodePtr at the head
    //while noePtr points to node, traverse the list
    while(nodePtr)
    {
        //display value
        printf("%s\n",nodePtr->var);
        //move to next node
        nodePtr = nodePtr->next;
    }

}
4

1 に答える 1

1

問題は、メインルーチンの新しい文字列に対して毎回再割り当てされるローカルポインタcmdを送信することによるものです。

これは、appendnodeAPIを変更することで解決できます

void appendNode(char *v, char *val)
{
    struct ListNode* newNode;//to point to new node
    struct ListNode* nodePtr = NULL;//to move through the list

    //allocate new node and store int there
    newNode = malloc (sizeof( struct ListNode));
    newNode->var = malloc(sizeof(v));
    newNode->value = malloc(sizeof(val));   
    strcpy(newNode->var, v);
    strcpy(newNode->value, val);    
    newNode->next = NULL;
    //if there are no nodes in the list make new node th efirst node
    if(!head)
    {
        head = newNode;

    }
    else
    {
        //initialize nodePtr to head
        nodePtr = head;
        //find the last node in the list
        while (nodePtr->next)
        {
            nodePtr = nodePtr->next;
        }
        //insert new node as the last node
        nodePtr->next = newNode;
    }

}
于 2013-02-11T03:38:13.357 に答える