该程序应打印至少上传了三个视频的用户的用户名。
我认为问题在于最后一个嵌套的for,打印的第一行是正确的,但其他行却不是。
这些是文件:

Archivio.txt

Ciro Esposito cir0esp [email protected]
Gennaro Sorrentino gennSor [email protected]
Pasquale Zemma pasZem [email protected]


Video.txt

cir0esp [email protected]  Io_al_mare 15 34
pasZem [email protected]  Festa_di_laurea 358 623
gennSor [email protected]  Io_allo_stadio 45 97
cir0esp [email protected]  Io_in_montagna 446 814
gennSor [email protected]  Io_al_parco 66 124
cir0esp [email protected]  Io_in_auto 10 23


代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100

struct DATI{ // STRUTTURA NON DINAMICA
    char nome [N];
    char cognome [N];
    char username[N];
    char email [N];
};

struct DATI dati [N];

struct PROFILO{ // STRUTTURA NON DINAMICA
    char username [N];
    char email [N];
    char titolo_video [N];
    int durata_video;
    int dimensione_video;
};

struct PROFILO profilo [N];

struct UTENTI{  // LINKED LIST
    char* account;
    struct UTENTI *next;
};

typedef struct UTENTI utenti;

// PROTOTIPO FUNZIONI

void Lista_utenti(FILE *ptr_archivio);
void Info_video(FILE *ptr_dati, FILE *ptr_video);

// MAIN

int main (){

    FILE *ptr_archivio; //LINKED LIST

    FILE *ptr_video;
    FILE *ptr_dati;

    // PER LA LINKED LIST
    ptr_archivio = fopen("Archivio.txt" , "r");

    // CONFRONTO ARCHIVIO E VIDEO
    ptr_video = fopen("Video.txt" , "r");
    ptr_dati = fopen("Archivio.txt" , "r");

    Lista_utenti(ptr_archivio);
    Info_video(ptr_dati, ptr_video);

    return 0;

}

// DEFINIZIONE FUNZIONI

void Lista_utenti(FILE *ptr_archivio){ // FUNZIONE PER LA LINKED LIST

    char lista [N];

    utenti *current, *head;
    head = current = NULL;

    if (ptr_archivio == NULL){
        printf("Errore, file non trovato!");
    }

    else{

        while(fgets(lista,sizeof(lista), ptr_archivio)){
            utenti *node = malloc(sizeof(utenti));
            node->account = strdup(lista);
            node->next = NULL;

            if(head == NULL){
                current = head = node;
            }
            else {
                current = current->next = node;
            }
        }
        fclose(ptr_archivio);
    }

    printf("LINKED LIST UTENTI\n");

    for(current = head; current ; current=current->next){
        printf("%s->", current->account);
    }
    printf("NULL\n");
}

void Info_video(FILE *ptr_dati, FILE *ptr_video){ // FUNZIONE PER CONFRONTO FILE ARCHIVIO E VIDEO

    int counter = 0;
    int j = 0;
    int i = 0;
    int totale = 0;
    char video [N];
    char archivio[N];

    if (ptr_dati == NULL){
        printf("Errore, file non trovato!");
    }
    else {
        while(fgets(archivio, N, ptr_dati)!= NULL){
            sscanf(archivio, "%s %s %s %s", dati[i].nome, dati[i].cognome, dati[i].username, dati[i].email);
            printf("\n\n");
            printf("Nome: %s\n" , dati[i].nome);
            printf("Cognome: %s\n" , dati[i].cognome);
            printf("Username: %s\n" , dati[i].username);
            printf("Email: %s\n" , dati[i].email);
            printf("\n\n");
            i++;
        }
    }

    fclose(ptr_dati);

    if (ptr_video == NULL){
        printf("Errore, file non trovato!");
    }
    else {

        while(fgets(video, N, ptr_video)!= NULL){
            sscanf(video, "%s %s %s %d %d", profilo[i].username, profilo[i].email, profilo[i].titolo_video, &profilo[i].durata_video, &profilo[i].dimensione_video);
            printf("\n\n");
            printf("Username: %s\n" , profilo[i].username);
            printf("Email: %s\n" , profilo[i].email);
            printf("Titolo video: %s\n" , profilo[i].titolo_video);
            printf("Durata video: %d secondi\n" , profilo[i].durata_video);
            printf("Dimensione video: %d mb\n" , profilo[i].dimensione_video);
            totale = totale + profilo[i].durata_video;
            i++;
            printf("\n\n");
        }

        fclose(ptr_video);
    }
    printf("La durata totale di tutti i video caricati e' di %d secondi\n" , totale);

    for(i=0; i<N; i++){
        for (j=0; j<N; j++){
            if (strcmp(dati[i].username,profilo[j].username)== 0){
                counter = counter+1;
                if (counter == 3){
                    printf("\nIl seguente utente %s ha caricato almeno 3 video" , dati[i].username);
                    counter = 0;

                }
            }
        }
    }
}

最佳答案

这是错误的:

for(i=0; i<N; i++){
    for (j=0; j<N; j++){


您在Ndati中没有profilo有效元素,这只是最大值。阅读用户和视频信息后,应保存计数器的值。我添加了变量dati_countprofilo_count

您还需要在从i读取的循环之前将0设置回ptr_video,以便从头开始填写profilo数组。

并且您应该检查sscanf()是否成功。

#Include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100

struct DATI{ // STRUTTURA NON DINAMICA
    char nome [N];
    char cognome [N];
    char username[N];
    char email [N];
};

struct DATI dati [N];
int dati_count;

struct PROFILO{ // STRUTTURA NON DINAMICA
    char username [N];
    char email [N];
    char titolo_video [N];
    int durata_video;
    int dimensione_video;
};

struct PROFILO profilo [N];
int profilo_count;

struct UTENTI{  // LINKED LIST
    char* account;
    struct UTENTI *next;
};

typedef struct UTENTI utenti;

// PROTOTIPO FUNZIONI

void Lista_utenti(FILE *ptr_archivio);
void Info_video(FILE *ptr_dati, FILE *ptr_video);

// MAIN

int main (){

    FILE *ptr_archivio; //LINKED LIST

    FILE *ptr_video;
    FILE *ptr_dati;

    // PER LA LINKED LIST
    ptr_archivio = fopen("Archivio.txt" , "r");

    // CONFRONTO ARCHIVIO E VIDEO
    ptr_video = fopen("Video.txt" , "r");
    ptr_dati = fopen("Archivio.txt" , "r");

    Lista_utenti(ptr_archivio);
    Info_video(ptr_dati, ptr_video);

    return 0;

}

// DEFINIZIONE FUNZIONI

void Lista_utenti(FILE *ptr_archivio){ // FUNZIONE PER LA LINKED LIST

    char lista [N];

    utenti *current, *head;
    head = current = NULL;

    if (ptr_archivio == NULL){
        printf("Errore, file non trovato!");
    }

    else{

        while(fgets(lista,sizeof(lista), ptr_archivio)){
            utenti *node = malloc(sizeof(utenti));
            node->account = strdup(lista);
            node->next = NULL;

            if(head == NULL){
                current = head = node;
            }
            else {
                current = current->next = node;
            }
        }
        fclose(ptr_archivio);
    }

    printf("LINKED LIST UTENTI\n");

    for(current = head; current ; current=current->next){
        printf("%s->", current->account);
    }
    printf("NULL\n");
}

void Info_video(FILE *ptr_dati, FILE *ptr_video){ // FUNZIONE PER CONFRONTO FILE ARCHIVIO E VIDEO

    int counter = 0;
    int j = 0;
    int i = 0;
    int totale = 0;
    char video [N];
    char archivio[N];

    if (ptr_dati == NULL){
        printf("Errore, file non trovato!");
    }
    else {
        while(fgets(archivio, N, ptr_dati)!= NULL){
            if (sscanf(archivio, "%s %s %s %s", dati[i].nome, dati[i].cognome, dati[i].username, dati[i].email) != 4) {
                continue;
            }
            printf("\n\n");
            printf("Nome: %s\n" , dati[i].nome);
            printf("Cognome: %s\n" , dati[i].cognome);
            printf("Username: %s\n" , dati[i].username);
            printf("Email: %s\n" , dati[i].email);
            printf("\n\n");
            i++;
        }
    }

    fclose(ptr_dati);
    dati_count = i;

    if (ptr_video == NULL){
        printf("Errore, file non trovato!");
    }
    else {
        i = 0;
        while(fgets(video, N, ptr_video)!= NULL){
            if (sscanf(video, "%s %s %s %d %d", profilo[i].username, profilo[i].email, profilo[i].titolo_video, &profilo[i].durata_video, &profilo[i].dimensione_video) != 5) {
                continue;
            }
            printf("\n\n");
            printf("Username: %s\n" , profilo[i].username);
            printf("Email: %s\n" , profilo[i].email);
            printf("Titolo video: %s\n" , profilo[i].titolo_video);
            printf("Durata video: %d secondi\n" , profilo[i].durata_video);
            printf("Dimensione video: %d mb\n" , profilo[i].dimensione_video);
            totale = totale + profilo[i].durata_video;
            i++;
            printf("\n\n");
        }

        fclose(ptr_video);
        profilo_count = i;
    }
    printf("La durata totale di tutti i video caricati e' di %d secondi\n" , totale);

    for(i=0; i<dati_count; i++){
        for (j=0; j<profilo_count; j++){
            if (strcmp(dati[i].username,profilo[j].username)== 0){
                counter = counter+1;
                if (counter == 3){
                    printf("\nIl seguente utente %s ha caricato almeno 3 video" , dati[i].username);
                    counter = 0;

                }
            }
        }
    }
}

07-25 23:31