PDA

Visualizza la versione completa : [C] Confronto stringhe con parole variabili


jumper21e
28-01-2010, 11:00
Salve a tutti! :ciauz:

Ho un problema che riguarda il confronto tra stringhe: devo realizzare un programma che gestisce liste, pile e code e fin qui non ci sono problemi. Il problema principale è che devo realizzare un sistema in cui l'utente inserisce una stringa di testo che rappresenta il comando da eseguire e, in base a questa, viene eseguito il task corrispondente.
Ad esempio, se l'utente digita:


"crea <nomeCollezione> come <tipoCollezione> di <tipoElementiCollezione>"
oppure


"inserisci in <nomeCollezione> il valore <valore> in testa"
io devo interpretare la stringa e, di conseguenza, eseguire il comando corrispondente. Le parole tra parentesi angolate ("< >") sono delle etichette per indicare il nome della collezione di dati (ad esempio, Collezione1, MiaCollezione, etc., come nomi di variabili), il tipo della collezione (ad esempio, lista, pila o coda) e, infine, il tipo di elementi che deve contenere la collezione (ad esempio, int, char o char *).

C'è un modo che non sia il confronto carattere per carattere per interpretare questi pattern?

Grazie per la pazienza e per la collaborazione.

Mr. Vinnie
28-01-2010, 14:12
Come saprai in C non esiste il tipo string per cui qllo che in C++ facciamo con ql tipo dovrai farlo manualmente ovvero confrontandone un carattere alla volta. Del resto è proprio qsto che fanno la strcpy, strcmp eccetera (funzioni per stringhe).

Diversamente puoi fare il menù cn le opzioni:
"inserisci 1 se <tipo>, 2..." e così via e qndi un confronto tra numeri è molto + semplice.

c_junior
28-01-2010, 14:30
i metodi per compare due stringhe in c dovrebbero essere:



memcmp Compare two blocks of memory (function)
strcmp Compare two strings (function)
strcoll Compare two strings using locale (function)
strncmp Compare characters of two strings (function)
strxfrm Transform string using locale (function)

Mr. Vinnie
28-01-2010, 14:36
Non so se senza la libreria funzionino ma nel caso dovessero andare anche in C la sintassi è:
strcmp (str1,str2);
RICORDA: ritorna "vero" se sono diverse, falso in caso contrario.
Se quindi vuoi vedere se l'utente ha immesso il nome giusto devi usare l'opreatore NOT:


if (!strcmp(str1, str2)){ //se corrispondenti...}


in caso contrario


if (strcmp(str1, str2)){ //se diverse...}

c_junior
28-01-2010, 15:22
Returns an integral value indicating the relationship between the strings:
A zero value indicates that both strings are equal.
A value greater than zero indicates that the first character that does not match has a greater value in str1 than in str2; And a value less than zero indicates the opposite.

jumper21e
28-01-2010, 15:32
Grazie a tutti per l'aiuto. Mr. Vinnie, credo che la funzione strcmp() ritorni 0 se le due stringhe SONO uguali. Quanto all'esercizio, sarebbe comodissimo anche per me creare un menu numerico così sarebbe tutto più semplice però purtroppo è più complesso... :dhò:
Pensavo ci fosse un modo più rapido per confrontare due stringhe a meno di qualche sostituzione ma purtroppo, da quanto ho capito, non è possibile.
La mia soluzione sarà quella di suddividere la stringa in input in token (cioè in parole), le memorizzerò in un array di stringhe e le confronterò con strcmp(). Se avete altri suggerimenti, io sono sempre qui! ;)

Mr. Vinnie
28-01-2010, 17:31
NO, al contrario di quanto ha detto c_junior e di quanto pensi tu (lo pensavo anche io) la strcmp ritorna vero se sono DIVERSE.

citazione:
<<Per utilizzare strcmp() è fondamentale ricordare che restituisce falso quando le stringhe coincidono. Pertanto sarà necessario utilizzare l'operatore ! (NOT) se si desidera che accada qualcosa quando le stringhe sono uguali [...]>>

Tratto da:
Guida al C++ (terza edizione), Herbert Shildt.

Mr. Vinnie
28-01-2010, 17:32
Anzi anche c_junior ha scritto la stessa cosa ora che rileggo:
zero value = falso, infatti.
:D

oregon
28-01-2010, 18:33
Originariamente inviato da Mr. Vinnie
NO, al contrario di quanto ha detto c_junior e di quanto pensi tu (lo pensavo anche io) la strcmp ritorna vero se sono DIVERSE.

citazione:
<<Per utilizzare strcmp() è fondamentale ricordare che restituisce falso quando le stringhe coincidono. Pertanto sarà necessario utilizzare l'operatore ! (NOT) se si desidera che accada qualcosa quando le stringhe sono uguali [...]>>

Tratto da:
Guida al C++ (terza edizione), Herbert Shildt.

La strcmp restituisce un intero, non un bool ...

Quindi restituisce un "numero" ... 0 se le stringhe coincidono, -1 o un +1 se sono differenti

Non si capisce se quel periodo tratto dal libro è riferito alla funzione strcmp (o ad altro codice in cui è usata la strcmp), ma nel primo caso, butta il libro ...

Mr. Vinnie
28-01-2010, 19:02
Ragazzi :D non vorrei di lungarmi in qsto tira e molla ma solo ricordare che 0 o falso in C++ hanno lo stessissimo medesimissimo significato. Algebra di Boole: Domanda- vero o falso?
tabella dell'algebra di B.: domanda - 0 o 1;

é lo stesso! :zizi:

Loading