Программа на C, работающая в режиме отладки и не работающая в режиме выпуска - PullRequest
0 голосов
/ 08 июня 2018

Я пишу программу, которая должна обрабатывать некоторые данные, хранящиеся в файле, и она прекрасно работает, когда я запускаю ее в режиме отладки внутри кодовых блоков, но вылетает, когда я пытаюсь заставить ее работать по-другому (либо нажимая на exe, либо пытаясьзапуск режима релиза) Я попробовал все, и я думаю, что не должно быть за пределами доступа или неинициализированных указателей, это просто абстракция от кода, поскольку он останавливается на функции readCSV, файл csv содержит 53 строки, а количество строкв состоянии подсчитать их правильно и при выпуске, printfs были в состоянии понять, где он останавливается, надеюсь, есть ошибки, которые я не могу обнаружить, заранее спасибо за помощь

typedef struct
{
 char* codice;
 char* nome;
 char* album;
 char* artista;
 int track;
 Durata durata;
 Genere genere;
}Brano;






   int countRowsCSV(const char* filename)
   {    FILE* file=fopen(filename,"r");
        char line[200];
        int i=0;
        if(file==NULL)
        return -1;
        while(!feof(file))
        {if(fgets(line,sizeof(line),file)!=NULL)
          i++;
        }
        fclose(file);
        return i;
   }



  char* getString(char* line)
 {
   printf("%s",line);
   char* a=NULL;
   a=(char*)malloc(sizeof(char)*strlen(line));
   strcpy(a,line);
   return a;
 }

 void readCSV(Brano* catalogo)
{
FILE* file=fopen("brani.csv","r");
char line[200]="";

int i;
if(file==NULL)
return ;

for (i=0;(!feof(file));i++)
{
    if(fgets(line,sizeof(line),file)!=NULL)
    {
        if(line[strlen(line)-1]!='\0')//I remove the final \n
        line[strlen(line)-1]='\0';
        printf("%s",line);
        catalogo[i].codice=NULL;
        catalogo[i].codice=getString(strtok(line,";"));
        printf("%s\n",catalogo[i].codice);
        catalogo[i].nome=NULL;
        catalogo[i].nome=getString(strtok(NULL,";"));
        printf("%s\n",catalogo[i].nome);
        catalogo[i].album=NULL;
        catalogo[i].album=getString(strtok(NULL,";")); //the program often crashes here with i=0
        printf("%s\n",catalogo[i].album);
        catalogo[i].artista=NULL;
        catalogo[i].artista=getString(strtok(NULL,";"));
        printf("%s\n",catalogo[i].artista);
        catalogo[i].track=atoi(strtok(NULL,";"));
        printf("%d\n",catalogo[i].track);
        catalogo[i].durata.minuti=atoi(strtok(NULL,";"));
        catalogo[i].durata.secondi=atoi(strtok(NULL,";"));
        catalogo[i].genere=stringToGenere(strtok(NULL,";"));
    }
}
fclose(file);

}

int main(void) {
int scelta=0,num_utenti=0,size_catalogo=countRows("brani.csv");
int size_publicP=0;

if(size_catalogo<0)
{ MessageBox(NULL,"Failed to open \"brani.csv\" ","ERROR MESSAGE",MB_ICONERROR|MB_ICONSTOP);
  return -1;
}
Brano* catalogo=NULL;
catalogo=(Brano*)malloc(sizeof(Brano)*size_catalogo);
Brano** pCatalogo=NULL;

Playlist** publicPlaylists=NULL;
Utente* loggedUser=NULL;
pCatalogo=(Brano**)malloc(sizeof(Brano*)*size_catalogo);
Utente* utenti=NULL;
readCSV(catalogo);

}

1 Ответ

0 голосов
/ 08 июня 2018

Ваш getstring() не так.Он не учитывает завершающий символ NUL.

  char* getString(char* line)
 {
   printf("%s",line);
   char* a=NULL;
   a=(char*)malloc(sizeof(char)*strlen(line));
   strcpy(a,line);
   return a;
 }

должен быть

 char *getString(char *line)
 {
     printf("%s",line);
     char* a=malloc(1 + strlen(line));
     strcpy(a,line);
     return a;
 }

Обратите внимание, что 1 + strlen() для учета завершающего символа NUL.

Обратите внимание, что sizeof(char) всегда одно по определению, и что вам не нужно разыгрывать void * в C.

Также, см. strdup().

...