связанный список: C: не хранит значения, которые я ищу - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть следующий код:

#include <dirent.h>
#include <stdio.h>
#include <string.h>

typedef struct stringData {
    char *s;
    struct stringData *next;
} Node;

Node *createNode(char *s) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->s = s;
    newNode->next = NULL;
    return newNode;
}


void insert(Node **link, Node *newNode) {
    newNode->next = *link;
    *link = newNode;
}

void printList(Node *head) {
    while (head != NULL) {
        printf("%s\n", head->s);
        head = head->next;
    }
}


void listFilesRecursively(char *path, char *suffix);


int main()
{
    // Directory path to list files
    char path[100];
    char suffix[100];

    // Suffix Band Sentinel-2 of Type B02_10m.tif

    // Input path from user
    printf("Enter path to list files: ");
    scanf("%s", path);
    printf("Enter the bands ending: ");
    scanf("%s", suffix);

    listFilesRecursively(path, suffix);

    return 0;
}

int string_ends_with(const char * str, const char * suffix)
{
    int str_len = strlen(str);
    int suffix_len = strlen(suffix);

    return 
        (str_len >= suffix_len) &&
        (0 == strcmp(str + (str_len-suffix_len), suffix));
}

/**
 * Lists all files and sub-directories recursively 
 * considering path as base path.
 */


void listFilesRecursively(char *basePath, char *suffix)
{
    char path[1000];
    struct dirent *dp;
    DIR *dir = opendir(basePath);
    //node_s *head, *first, *temp=0;
    //head = malloc(sizeof(node_s));
    Node *head = NULL;
    Node *tail = NULL;
    Node *n;


    // Unable to open directory stream
    if (!dir)
        return;

    while ((dp = readdir(dir)) != NULL)
    {


        if (strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0)
        {
            //printf("%s\n", dp->d_name);

            // Construct new path from our base path
            strcpy(path, basePath);
            strcat(path, "/");
            strcat(path, dp->d_name);

            if (string_ends_with(path, suffix))
            {
                n = createNode(path);
                insert(&head, n);
                tail = n;   
                printf("%s\n", path);
            }
            listFilesRecursively(path, suffix);
        }
    }

    //printList(head);

    closedir(dir);
}

И цель - сохранить значения рекурсивного поиска в каталоге, в связанном списке. Я создал структуру для узла для строковых данных, который указывает на следующий элемент связанного списка. Я также добавил несколько функций для вставки новых данных и указания на следующую. И, наконец, я могу распечатать значения связанного списка, вызвав функцию printLIst. Однако, когда я деактивирую строку 109, где вызывается функция printList, значения, напечатанные в строке 103, являются правильными. Если я прокомментирую строку 103 и вызову функцию printLIst со значениями, хранящимися в моем связанном списке, то появится список файлов, значения которых полностью отличаются от значений, напечатанных в строке 103.

Является ликакая-то черная магия в Си? или почему это странное поведение?

1 Ответ

1 голос
/ 06 ноября 2019

В этом операторе

n = createNode(path); 

вы храните указатель на один и тот же локальный массив path в каждом узле. См. Определение функции createNode.

Node *createNode(char *s) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->s = s;
    newNode->next = NULL;
    return newNode;
}

Таким образом, программа, по крайней мере, из-за этой ошибки, имеет неопределенное поведение.

Вы должны сделать копию переданной строки вместо того, чтобы просто присвоить ей указатель на элемент данных s.

...