簡體   English   中英

使用 realloc 動態增加 C 中的數組大小

[英]Dynamically increase array size in C using realloc

我正在嘗試將文件的元素保存到結構數組中。

我想動態增加分配在數組中的 memory 以適合我文件中的總行數(結構)。

.txt 文件如下所示:

R&B;6jvvpPJQJy5rMOEkLlADl6;Trey Songz
R&B;6p8JTP4A9NZHtxRVhkEo6s;T-Pain
R&B;3SwhPTNNU5hpF33bbCsji6;BJ The Chicago Kid
R&B;5yvhdo8FXbBsIllxv2Rr94;SZA
R&B;5Yq38evNk28qlTVHHtwBhT;James Blake
R&B;5yamjs92dcayRVlNuY116G;H.E.R.
R&B;4FjcZsKyGhhZnuYq0nzXpZ;T-Pain
R&B;22jnEneSABg4vRCR1vow7F;Daniel Caesar
R&B;57qiTKh8bVX0VtfUNTQqhw;The Weeknd

這是目前我的代碼。 songFilegenresListsongsList做同樣的事情,但目前還沒有實現)

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


typedef struct genresFile{
    char* genre;
    char* idSong;
    char* artist;
} genresFile;

typedef struct songsFile{
    char* idSong;
    int popularity;
    char* mode;
} songsFile;


int main(int argc, char *argv[])
{
    FILE* songs = fopen("songs.txt", "r");
    FILE* genres = fopen("genres.txt", "r");
    
    genresFile* genresList = NULL;
    //songsFile* songsList = NULL;

    char *buf = malloc(256);
    char *tmp;

    int i = 0;
    while (fgets(buf, 255, genres)){      
        genresList = realloc(genresList, (i+1)*sizeof(genresFile));
        if ((strlen(buf)>0) && (buf[strlen (buf) - 1] == '\n'))
            buf[strlen (buf) - 1] = '\0';       
        genresFile object;
        tmp = strtok(buf, ";");
        object.genre = tmp;

        tmp = strtok(NULL, ";");
        object.idSong = tmp;

        tmp = strtok(NULL, ";");
        object.artist = tmp;

        genresList[i] = object;
        i++;
    }
    
    printf("%s, %s, %s\n",genresList[3].genre, genresList[3].idSong, genresList[3].artist);

    
    free(genresList);
    //free(songsList);
    fclose(songs);
    fclose(genres);
    return 0;
}

這是我從最后的印刷品中得到的 output:

Soul, qWZdkBl4UVPj9lK6HuuFM, r Thomas & The Volcanos

這是 .txt 文件的最后一行,藝術家的名字開頭缺少一個字母。

這將保存在數組的每個元素中。 請幫忙:D

分配指針並不意味着復制字符串。

緩沖區buf在以下幾行中被覆蓋,因此指針指向的內容也發生了變化。

為避免這種情況,您應該復制字符串而不是僅僅分配指針。

可以這樣做:

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


typedef struct genresFile{
    char* genre;
    char* idSong;
    char* artist;
} genresFile;

typedef struct songsFile{
    char* idSong;
    int popularity;
    char* mode;
} songsFile;

char* copy_string(const char* str) {
    char* copy = malloc(strlen(str) + 1); /* +1 for terminating null-character */
    if (copy != NULL) strcpy(copy, str);
    return copy;
}

int main(int argc, char *argv[])
{
    FILE* songs = fopen("songs.txt", "r");
    FILE* genres = fopen("genres.txt", "r");
    
    genresFile* genresList = NULL;
    //songsFile* songsList = NULL;

    char *buf = malloc(256);
    char *tmp;

    int i = 0;
    while (fgets(buf, 255, genres)){      
        genresList = realloc(genresList, (i+1)*sizeof(genresFile));
        if ((strlen(buf)>0) && (buf[strlen (buf) - 1] == '\n'))
            buf[strlen (buf) - 1] = '\0';       
        genresFile object;
        tmp = strtok(buf, ";");
        object.genre = copy_string(tmp);

        tmp = strtok(NULL, ";");
        object.idSong = copy_string(tmp);

        tmp = strtok(NULL, ";");
        object.artist = copy_string(tmp);

        genresList[i] = object;
        i++;
    }
    
    printf("%s, %s, %s\n",genresList[3].genre, genresList[3].idSong, genresList[3].artist);

    
    free(genresList);
    //free(songsList);
    fclose(songs);
    fclose(genres);
    return 0;
}

如果您的(目標)環境支持它,您可以使用strdup()而不是這個copy_string()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM