该程序应打印至少上传了三个视频的用户的用户名。
我认为问题在于最后一个嵌套的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++){
您在
N
和dati
中没有profilo
有效元素,这只是最大值。阅读用户和视频信息后,应保存计数器的值。我添加了变量dati_count
和profilo_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;
}
}
}
}
}