简体   繁体   中英

How do I add multiple strings to an array?

I want to read all .txt files in the directory and add those file names to an array. Catching the text files part is okay but I am having a problem storing those file names inside an array. What is the mistake I've done here? This is my code.

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <strings.h>

int main()
{
    DIR *p;
    struct dirent *pp;
    p = opendir ("./");
    char file_list[10][10];
    char shades[10][10];
    int i = 0;

    if (p != NULL)
    {
        while ((pp = readdir (p))!=NULL) {
        int length = strlen(pp->d_name);
        if (strncmp(pp->d_name + length - 4, ".txt", 4) == 0) {
            puts (pp->d_name);
            strcpy(shades[i], pp->d_name);
            }
        }
        i = i + 1;


    (void) closedir (p);

    for(int i=0; i<4; i++){
        printf("\n %s", &shades[i]);
    }
    }

    return(0);
}

What seems to be a problem here is that 'strings' in C works much different than in C++ or C# or Python. To make it work you'll need to alloc memory for each string.

If I understood correctly what you want to do, here's an example:

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

#define FILE_LIST_MAX 10

int main()
{
    DIR *p = opendir("./");
    struct dirent *pp;
    char **file_list = malloc(FILE_LIST_MAX * sizeof(char*));
    int i = 0;

    if (p == NULL) {
        printf("Could not open current directory" );
        return 0;
    }

    while ((pp = readdir(p)) != NULL) {
        int length = strlen(pp->d_name);
        printf ("%s\n", pp->d_name);

        if(length > 4 && memcmp(pp->d_name + length - 4, ".txt", 4) == 0) {
            char filename[length];
            sprintf(filename, "%s", pp->d_name);
            file_list[i] = malloc(length * sizeof(char));
            strcpy(file_list[i], filename);
            i++;
        }
    }

    (void) closedir(p);

    printf("\n.txt filenames within array");

    for(int j = 0; j < i; j++) {
        printf("\n%s", file_list[j]);
    }
    
    for(int j = 0; j < i; j++) {
        free(file_list[j]);
    }
    free(file_list);

    return(0);
}

It's not perfect though as you must manually change file_list capacity in FILE_LIST_MAX

Here's an example output from executing this code:

.txt 数组中的文件名

Much better approach would be implementing a dynamic array of chars which will automatically resizes as necessary.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM