Domanda Stampare nomi film di un regista

KHAN21

Utente Bronze
9 Gennaio 2021
32
14
1
20
Buongiorno, mi è stato dato come compito per il 7 maggio di creare questi vettori bidimensionali paralleli, che contengano i nomi dei film, dei registi e i relativi incassi. Il programma non riporta nessun errore fin quando devo effettivamente stampare la stringa con i nomi dei film, e capita che stampi anche il primo carattere dell'elemento prima. Ringrazio anticipatamente per le risposte.
C:
#include <stdio.h>
#include <stdlib.h>
#define maxL 50
int lungArr();
int nFilm();
int lungInt();
void carica(char *, char*, float[],int);
void stampa(char *, char *, int);
int main(void) {
 int n = nFilm();
  char **titoli = malloc(n * sizeof(char *));
  for (int i = 0; i < maxL;i++){
    titoli[i] = malloc(maxL * sizeof(char));
  }
  char **autori = malloc(n * sizeof(char *));
  for (int i = 0;i < maxL;i++){
    autori[i] = malloc(maxL * sizeof(char));
  }
  float incassi[n];
  carica(*titoli, *autori, &incassi[n], n);
  stampa(*titoli, *autori, n);
  return 0;
}



int nFilm(){
  int a;
  printf("inserisci il numero dei film, che sarà uguale a quello degli incassi e dell'autore: ");
  scanf("%d", &a);
  return a;
}

void carica(char *a, char *b, float *c,int d){
  for (int i = 0;i < d; i++){
    printf("inserisci il nome del film: ");
    scanf(" %[^\n]s", &a[i]);
    printf("inserisci il regista del film: ");
    scanf(" %[^\n]s", &b[i]);
    printf("inserisci l'incasso del film: ");
    scanf(" %f", &c[i]);
  }
}

void stampa(char *a, char *b, int c){
  int n;
  char *nome = malloc(maxL * sizeof(char));
  printf("inserisci il nome del regista cui film verranno stampati: ");
  scanf(" %[^\n]s", nome);
  for (int i = 0; i < c; i++){
    if (nome == &b[i]){
      n = i;
    }
  }
  for (int i = 0; i < c; i++){
    if (i >= n){
      printf("%s\n", &a[i]);
    }
  }
}
Messaggio unito automaticamente:

ah si, dimenticavo di dire che il mio professore ha la passione per il ciaccolare durante la lezione, per cui spiega solitamente solo 20 minuti, quindi sarò un probabile frequente visitatore del forum :)
 

JunkCoder

Moderatore
5 Giugno 2020
980
19
809
393
Ci sono diverse corruzioni della memoria, eseguendolo in debug continua a crashare, i problemi sono tanti, legati alla gestione dei puntatori. Devi proprio usare malloc? Se si usalo anche per allocare float* incassi, perché nel codice è un VLA e ricorda di usare free per evitare memory leak. Le funzioni hanno argomenti del tipo sbagliato: non dovresti dereferenziare i char**, altrimenti quando fai la scanf per caricare i dati invece di scriverli nelle varie stringhe li scrivi uno sopra l'altro a distanza di un carattere nella prima stringa di ogni array (finché non supera i 50 caratteri, poi va in buffer overflow).

C:
void carica(char *a, char *b, float *c,int d);
carica(*titoli, *autori, &incassi[n], n);
// Diventa
void carica(char **a, char **b, float *c,int d);
carica(titoli, autori, incassi, n);

Fai lo stesso con l'altra funzione.
 

KHAN21

Utente Bronze
9 Gennaio 2021
32
14
1
20
Ci sono diverse corruzioni della memoria, eseguendolo in debug continua a crashare, i problemi sono tanti, legati alla gestione dei puntatori. Devi proprio usare malloc? Se si usalo anche per allocare float* incassi, perché nel codice è un VLA e ricorda di usare free per evitare memory leak. Le funzioni hanno argomenti del tipo sbagliato: non dovresti dereferenziare i char**, altrimenti quando fai la scanf per caricare i dati invece di scriverli nelle varie stringhe li scrivi uno sopra l'altro a distanza di un carattere nella prima stringa di ogni array (finché non supera i 50 caratteri, poi va in buffer overflow).

C:
void carica(char *a, char *b, float *c,int d);
carica(*titoli, *autori, &incassi[n], n);
// Diventa
void carica(char **a, char **b, float *c,int d);
carica(titoli, autori, incassi, n);

Fai lo stesso con l'altra funzione.
ho eseguito come dici tu, ma riscontro che non entra nell’if che controlla se il nome inserito è uguale al nome del regista.
Qui la funzione:
C:
void stampa(char **a, char **b, int c){
  int n;
  char *nome = malloc(maxL * sizeof(char));
  printf("inserisci il nome del regista cui film verranno stampati: ");
  scanf(" %[^\n]s", nome);
  for (int i = 0; i < c; i++){
    if (nome == b[i]){
      printf("%s", a[i]);
    }
  }
}
 

JunkCoder

Moderatore
5 Giugno 2020
980
19
809
393
Hai due stringhe char*, non puoi confrontarle con ==, altrimenti non confronti il valore del testo ma l'indirizzo dei due puntatori, che sarà sempre diverso. Cambia l'if in: if (stricmp(nome, b[i]) == 0)