|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2005
Messaggi: 711
|
comparare stringhe in C da un file di testo
Ancora una volta vi pongo qsto quesito... Ho già il listato di come comparare le stringhe e ve lo posto mi aiutate ad applicarlo ad un file di testo?? Devo cancellare le stringhe uguali in un file di testo formato da mails..
ogni mail va a capo... il listato è qsto: #include <stdio.h> #include <string.h> int strcmp (const char *s1, const char *s2) { unsigned char *a = (unsigned char *) s1; unsigned char *b = (unsigned char *) s2; size_t i; for (i = 0; ; i++) { if (a[i] = b[i]) { return a[i] } } } so anke come si apre un file di testo ma sto provando difficoltà ad integrare le 2 cose... per favore aiutatemiii
__________________
Ho concluso affari positivamente con Schiac,Sam_88, Toretto, Bobosassa Vendo qui Contatto MSN/MAIL : [email protected] Sito web http://www.visioweb.it |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jun 2005
Messaggi: 711
|
grazie x la guida
ma non so come integrarla già mi sono documentato su strcmp il problema è come integrarla mi servirebbe + un frammento di codice
__________________
Ho concluso affari positivamente con Schiac,Sam_88, Toretto, Bobosassa Vendo qui Contatto MSN/MAIL : [email protected] Sito web http://www.visioweb.it |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Vediamo, se non ho capito male hai una lista di mail e vuoi togliere tutti i duplicati.
Una cosa di questo tipo dovrebbe andare (pseudocodice): Codice:
a = lista vuota;
per ogni riga del file
{
aggiungi riga ad a;
}
n = lunghezza di a;
per i che va da 1 ad n
{
per j che va da (i + 1) ad n
{
se a[i] è uguale ad a[j]
{
rimuovi a[j];
}
}
}
Se invece fai una cosa simile: Codice:
a = lista vuota;
per ogni riga del file
{
aggiungi riga ad a;
}
ordina a;
n = lunghezza di a;
i = 1;
finché (i < n)
{
j = (i + 1);
finché (a[i] è uguale ad a[j])
{
rimuovi a[j];
j = (j + 1);
}
i = j;
}
Ovviamente il tutto è molto approssimativo. Per confrontare stringhe hai la strcmp() (se ti dà 0, le stringhe sono identiche).
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 09-08-2009 alle 14:11. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jun 2005
Messaggi: 711
|
esatto ma
l'algoritmo è proprio qsto il problema è implementarlo in C...
ma la strcmp non risolve il mio problema.. o almeno se mi rimanda allo 0 .. Non mi serve saxe quale stringa è uguale mi serve che non ci siano mails uguali nel testo specifico quindi deve anke cancellarmi i doppioni... Visto che qsto è solo una parte di un problema molto + grande ho anke una certa urgenza e poca voglia di perderci tempo.. Quindi mi chiedo se qualcuno poteva aiutarmi o scrivendomi o rendendomi facile la scrittura di qsto programmino grazie ancora
__________________
Ho concluso affari positivamente con Schiac,Sam_88, Toretto, Bobosassa Vendo qui Contatto MSN/MAIL : [email protected] Sito web http://www.visioweb.it |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
L'algoritmo te l'ho dato con tanto di spiegazione su come comparare le stringhe, resterebbe da fare l'implementazione di una lista (doppiamente?) linkata. Purtroppo ho anche io molto da fare e poco tempo per farlo, quindi non posso aiutarti più di così, mi spiace.
ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2005
Messaggi: 711
|
Grazie cmq
Grazie lo stesso ma ho risolto con un semplice sort -u da shell linux e le ho eliminate a mano xkè chissà x quale oscura ragione il comando uniq non andava... ma se avete il listato fate pure
__________________
Ho concluso affari positivamente con Schiac,Sam_88, Toretto, Bobosassa Vendo qui Contatto MSN/MAIL : [email protected] Sito web http://www.visioweb.it |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
|
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Gli indici non li ho considerati più di tanto, era più un'idea che un'implementazione, non avevo nessuna pretesa di correttezza. Non vedo perché debba essere O(n²) e perché dovrebbe fermarsi alla prima occorrenza - anche se magari mi sbaglio, anche ora vado di fretta e gli ho lanciato proprio un'occhiata.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
Si ferma alla sola prima occorrenza di eventuali dati uguali non contigui, perchè la condizione è a[i]==a[j] con conseguente valore false al primo confronto fallito. Per quanto riguarda la complessità prova ad analizzare il caso peggiore in cui la struttura contenga tutti dati uguali(o dualmente tutti dati diversi imponendo nel while interno la condizione di disuguaglanza). |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
[EDIT: database impazzito]
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 10-08-2009 alle 14:46. |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
[EDIT: database impazzito]
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 10-08-2009 alle 14:55. |
|
|
|
|
|
#13 | |||
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Odio quando il database di HardwareUpgrade dà i numeri.
Ricopio: Quote:
Quote:
Quote:
ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|||
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Non avevo letto la preliminare operazione di ordinamento, quindi è vero che funziona, ma lo fa ugualmente con complessità (nel caso peggiore O(n²))data non dall' ordinamento ma dall' iterazione di eliminazione. Parti dal pressuposto che iterando su una lista le eliminazioni le dovrai andare a fare su una struttura di appoggio, onde evitare problemi di accesso in concorrenza. Come dicevo su il caso peggiore è quello di una lista contenente tutti elementi uguali: pur eliminando sulla struttura di appoggio tutti gli elementi alla prima iterazione, il ciclo while continuerà sulla lista facendo ad ogni iterazione esterno (n-i-1) confronti che per una lista di 10 elementi corrisponde a circa 50 confronti dati da n*(n/2) ovvero O(n²).
|
|
|
|
|
|
#15 | ||
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Quote:
ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
||
|
|
|
|
|
#16 | ||
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
Quote:
Ultima modifica di nuovoUtente86 : 10-08-2009 alle 15:28. |
||
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Se proprio sono costretto a dimostrare ovvietà... Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
char *email;
struct node *next;
struct node *previous;
};
typedef struct node Node;
struct list
{
Node *head;
Node *tail;
};
typedef struct list List;
void DeleteNode(Node *tmp)
{
Node *n = tmp->next;
Node *p = tmp->previous;
if (p)
{
p->next = n;
}
if (n)
{
n->previous = p;
}
free(tmp->email);
free(tmp);
}
List *NewList()
{
List *p = (List *) malloc(sizeof(List));
if (!p)
{
fprintf(stderr, " [**] Cannot allocate.\n");
abort();
}
memset(p, 0, sizeof(List));
return p;
}
void DeleteList(List *l)
{
Node *tmp = l->head;
while (tmp != NULL)
{
Node *next = tmp->next;
DeleteNode(tmp);
tmp = next;
}
free(l);
}
void ListPushBack(List *l, char *s)
{
Node *tmp;
Node *n = (Node *) malloc(sizeof(Node));
if (!n)
{
fprintf(stderr, " [**] Cannot allocate.\n");
abort();
}
memset(n, 0, sizeof(Node));
n->email = s;
if (l->head == NULL)
{
l->head = n;
}
if (l->tail != NULL)
{
l->tail->next = n;
}
n->previous = l->tail;
l->tail = n;
}
void PrintList(List *l)
{
Node *tmp = l->head;
while (tmp != NULL)
{
printf(" => %s\n", tmp->email);
tmp = tmp->next;
}
}
int ReadFile(const char *name, List *l)
{
FILE *fp = fopen(name, "r");
if (!fp)
{
return -1;
}
while (1)
{
size_t n;
char *s = (char *) malloc(1024 * sizeof(char));
if (fgets(s, 1024, fp) == NULL)
{
break;
}
n = (strlen(s) - 1);
if (s[n] == '\n')
{
s[n] = '\0';
}
ListPushBack(l, s);
}
fclose(fp);
return 0;
}
int main()
{
Node *tmp;
List *l = NewList();
if (ReadFile("input.txt", l) != 0)
{
DeleteList(l);
fprintf(stderr, " [**] Cannot read file.\n");
abort();
}
tmp = l->head;
while (tmp != NULL)
{
char *first = tmp->email;
tmp = tmp->next;
while ((tmp != NULL) && (strcmp(first, tmp->email) == 0))
{
Node *next = tmp->next;
DeleteNode(tmp);
tmp = next;
}
}
PrintList(l);
DeleteList(l);
return 0;
}
Codice:
[email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected]
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Hai utilizzato una lista concatenata ed è pacifico che funzioni, ma è solo uno scenario possibile. Prova a riscrivere lo stesso algoritmo in Java utilizzando un' ArrayList e for each(ma anche normale). Ovviamente è possibile ovviare al problema con l' utilizzo di altre strutture o di particolari stratagemmi, ma è bene ipotizzare su tutte le situazioni che possono verificarsi.
Ultima modifica di nuovoUtente86 : 10-08-2009 alle 16:25. |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
Giusto per la cronaca, se l' ordinamento non è espressamento richiesto, è possibile creare un algoritmo a complessità lineare (pari alla lettura del file), utilizzando un set con funzionamento hash e trascurando in prima analisi le liste di collisione. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:33.



















