Newsgroup: it.comp.lang.c
Titolo: Confronto tra stringhe e problemi...

Salve, da poco ho scoperto questo NG e noto con piacere che ci sono
persone molto qualificate. Io sono un esperto di java, ma purtroppo
sono alle prime armi con il C...passo subito al sodo!
Sto creando una lista di utenti connessi ad un server tramite un
albero AVL(bilanciato) ma il problema principale è l'ordinamento in
base all'userId; cioè come fare per confrontare due stringhe e avere
un ordinamento...
Es:
pippo < pluto Allora pippo nel sottoalbero sx e così via..
Esiste qualche metodo per il confronto tra le stringhe???
Poi ecco una struttuta :
struct node{
  char userId[MAX_STRING];
  char password[MAX_STRING];
  int status;
  char pipe[MAX_STRING];
  struct node *left;
  struct node *right;
  };
typedef struct node NODE;
typedef NODE *GTREE;
e il suo metodo di inizializzazione :
/* Creazione di un nuovo nodo. */
GTREE new_gnode() {
  return (malloc(sizeof(node)));
  }
/* Inizializzazione del nodo.*/
GTREE init_gnode(char uId[MAX_STRING], char pss[MAX_STRING]) {
  GTREE tmp = new_gnode();
  tmp.userId = uId;
  tmp.password = pss;
  tmp.status = 1;
  tmp.left = tmp.right;
  return tmp;
  }
Non riesco a far funzionare quest'ultimo metodo..
Sapete aiutarmi???
Grazie

 Esiste qualche metodo per il confronto tra le stringhe???
strcmp();
strncmp();
HTH
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 tmp.password = pss;
   strncpy(tmp.password, pss, sizeof(tmp.password));
Inoltre sarebbe buona cosa, fare:
   memset(tmp.pipe, 0, sizeof(tmp.pipe));
Per usare le funzioni str...() e mem...() devi #includere <string.h>.
--
Cingar
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 GTREE init_gnode(const char * char, const char * pss)
Ooops!
   GTREE init_gnode(const char * uId, const char * pss)
--
Cingar
P.S. 'Sta dislessia mi va peggiorando!


 Per usare le funzioni str...() e mem...() devi #includere <string.h>.
Scusami, posso usare memset per azzerare qualsiasi stringa di qualsiasi
lunghezza?
Grazie
Luther

 lunghezza?
La memset() puo' essere utilizzata per memorizzare qualsiasi cosa
entri in un int (non solo 0) in una area di memoria indirizzata
dal primo argomento e di dimensione pari all'ultimo argomento.
L'unico vincolo e' che la memoria sia scrivibile...
Questo
char* pippoP = "Area di memoria non scrivibile";
memset(pippo, ' ', strlen(pippoP));
e' un esempio di uso scorretto della memset()...
Questo
char pippo[] = "Area di memoria non scrivibile";
memset(pippo, ' ', sizeof(pippo));
e' corretto.


 ha scritto nel messaggio
news:766c11dc47a3c1700e3...@mygate.mailgate.org...

Questo potrebbe permettermi di sbiancarmi i miei array di char???
Ciao
Luther

 Questo potrebbe permettermi di sbiancarmi i miei array di char???
E secondo te perche' avrei usato ' ' come secondo parametro per la
memset()? :-)
Come al solito va messo sempre il carattere '\0' alla fine altrimenti
so 'zzi.
pippo[sizeof(pippo) -1] = '\0'



Ho convertito un po tutto come mi avevi suggerito e almeno a rincuorarmi è
il fatto che tutto funzioni come prima e non peggio ,entrambi i problemi
ancora sono li, il secondo solamente sembra essersi "modificato".
A questo punto mi viene il dubbio di aver sforellato su qualche stringa...
Pensa che a volte mi capita anche che una funzione venga eseguita due volte
di seguito anche se esiste una sola chiamata alla stessa!!
Sto a impazzirmi.
Un altra cosa, quando dichiaro come mi hai suggerito char Nomeva[lunghezza]
= {'\0};
Il terminatore in che posizione lo mette sulla prima o sull'ultima?
Se sulla prima mi tocca gestire il \0 appena lo uso quindi non converrebbe
metterlo alla fien direttamente?
Sono ancora molto confuso, tra i vari manuali online quando trattano di
stringhe dicono si di mettere il terminatore, ma di esempi ne fanno davvero
pochini...
Ciao
Luther

 pochini...
Se e' per questo array e puntatori sono un grosso casino.


 
A che serve esattamente questa funzione?????

 A che serve esattamente questa funzione?????
Pone a 0 ogni singolo byte della zona di memoria puntata da tmp.pipe.
Come è buona norma azzerare ogni variabile (in C/C++ intendo) prima di 
usarla (perchè non è detto che il compilatore generi automaticamente 
codice di settaggi iniziali delle variabili) così (e a maggior ragione) 
bisognerebbe fare con le strutture allocate dinamicamente con 
malloc(quante probabilità ci sono che la memoria richiesta con mallo la 
trovi bella che vuota?).
-- 
Quando noi ignoranti eravamo di più, tutto era più bello (A. Celentano).
  ___   _   ___ _  _______   _______ ___
|   \ /_\ | _ \ |/ / _ ) \ / /_   _| __|
| |) / _ \|   / ' <| _ \\ V /  | | | _|
|___/_/ \_\_|_\_|\_\___/ |_|   |_| |___|

Poi stranamente, anche eseguendo il tuo codice l'errore risulta sempre lo stesso :
"request for member `userId' in something not a structure or union"
eppure copio come dici tu...ma l'errore rimane lo stesso!

 Grazie
Di niente
