从char数组中打出更多的值然后就可以了吗?

时间:2018-01-25 14:12:56

标签: c function pointers struct

我目前正在开发一个程序,用于从文本文件中读取信息。文本文件包含一个歌曲列表,我创建了一个结构,应该能够将每首歌曲保存在我的程序中的歌曲列表中。

我已将程序划分为不同的文件,它们看起来像这样。

的main.c

#include "FuncDek.h"
#include <locale.h>
#include <crtdbg.h>
int main()
{

//For swedish and check memory leak
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
setlocale(LC_ALL, "swedish");

//Create with starting size of 5
Song *ptr = (Song *)malloc(sizeof(Song) * 4);

int menuChoice = 0;
int nrOfSongs = 0;

//Read from file
readFromFile(ptr, &nrOfSongs);
system("pause");

do
{
    system("cls");
    menuChoice = menu();

    switch (menuChoice)
    {
    case 1: 
        addSong(ptr, &nrOfSongs);
        break;
    case 2:
        showList(ptr, nrOfSongs);
        break;
    case 0:
        break;
    default:
        printf("\nFelaktigt val, försök igen\n");
        system("pause");
        break;
    }

} while (menuChoice != 0);

free(ptr);

system("pause");
return 0;
}

FuncDek.h

#ifndef FUNCDEK
#define FUNCDEK

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

typedef struct {
    char title[25];
    char artist[25];
    char year[4];

} Song;

int menu();
void addSong(Song *ptr, int *nrOfSongs);
void showList(Song *ptr, int nrOfSongs);
void readFromFile(Song *ptr, int *nrOfSongs);

#endif

最后是FuncDek.c

#include "FuncDek.h"
#pragma warning(disable: 4996)


//Print all from list
void showList(Song *ptr, int nrOfSongs)
{
    system("cls");
    printf("Låtlista\n");
    printf("-------------------------------\n");
    for (int i = 0; i < nrOfSongs; i++)
    {       
        printf("Title: %s", ptr[i].title);
        printf("Artist: %s", ptr[i].artist);
        printf("År: %s \n\n", ptr[i].year);

    }
    system("pause");
}


//Read from file
void readFromFile(Song *ptr, int *nrOfSongs)
{
    FILE *fileOpen;

    fileOpen = fopen("song.txt", "r+");
    if (fileOpen == NULL)
    {
        printf("Something went wrong. Could't open file\n");
    }

    char line[100];
    int counter = 0;
    int nrOfSongsInList = 0;

    /*Read all information to line*/
    while (fgets(line, sizeof(line), fileOpen) != NULL)
    {
        if (counter == 0)
        {
            nrOfSongsInList = line[0] - '0';
            counter++;
        }
        else if (counter % 2 == 1 && counter == 1)
        {
            strcpy(ptr[*nrOfSongs].title, line);
            counter++;
        }

        else if (counter % 2 == 0)
        {
            strcpy(ptr[*nrOfSongs].artist, line);
            counter++;
        }

        else if (counter % 3 == 0)
        {   
            strcpy(ptr[*nrOfSongs].year, line);
            counter = 1;
            *nrOfSongs += 1;
        }

    }

    fclose(fileOpen);
}

我现在可以阅读我的文本文件并将我的歌曲存储在我的stong结构中,并为此分配了内存。 当我尝试使用showList函数时,我的问题出现了。我可以打印出ptr [i] .artist和ptr [i] .title正确,但出于某种原因,当我打印ptr [i] .year时,它会显示年份+列表中下一首歌的标题。< / p>

我的文本文件如下所示,每行以“\ n”结束。

4 Tambourine Man先生 鲍勃·迪伦 1965年 死去的爱之歌 肉饼 1981年 欣快症 罗琳 2012 爱我吧 约翰传奇 2016

我无法理解为什么它会打印超过一年。我注意到如果我在我的结构中使年份数组与其他2相同,那么问题就会消失。但我想明白。

当我在VS中调试时,它表示它在年份arr中存储了正确的值。 任何人都知道我可能错过了什么?

0 个答案:

没有答案