[C] Stringhe Linguaggio C
Ciao a tutti. Sto concludendo un progetto di programmazione in linguaggio C, ed ho problemi riguardante quest'ultimo passo. Devo ricavare una funzione che mi calcoli la composizione di due sostituzioni del linguaggio dei predicati di primo ordine.
Il concetto di composizione è veramente semplice (lo scrivo ai fini di determinare la complessità della funzione).
Guardo nella prima sostituzione se ho una variabile (x,y,z) a sinistra della / , poi nella seconda guardo se ho la stessa variabile a destra della /, se si, vado a sostituire la prima variabile con il simbolo associato alla variabile che ho trovato anche nella seconda (dove con associato intendo quello che sta a sinitra della / della variabile in questione nella seconda sostituzione). Ed infinite tolgo i legami in più (doppi), ovvero quelli che nella nuova composizione hanno la stessa variabile a destra della /.
Esempio
Constanti: abc
Variabili: xyz
Simboli di funzione: f()
s1= [b/y,y/z,f(a)/x] ed s2 = [a/y,b/z], ottengo [b/y,a/z,f(a)/x,b/z], elimino b/z,in quanto ho sia a/z che b/z,
ricavando la composizione [b/y,a/z,f(a)/x]
Quindi, a livello di programmazione, tutto ciò prevede che io cerchi degli elementi nella prima stringa, andare a vedere se sono presenti nella seconda, e sostituirli con il valore assegnato nella seconda, rimuoverne alcuni, andando così a creare una terza stringa, nuova. Sapreste consigliarmi che funzioni potrei sfruttare? E soprattutto i metodi che conviene usare per il lavoro di check dei simboli, sostituzioni e come andare ad inserirli in una nuova stringa.
Quelle che fino ad ora ho pensato potessero essere utili sono:
strcpy, strncpy, strcat e strncat. Trovo difficoltà nell'applicazione, in quanto sono confuso sul metodo che mi conviene usare. Non vorrei andare a fare un metodo mio, che mi complica solamente la faccenda.
Ps non so se sia importante, ma le stringhe le passo a funzione come *char
Spero di non aver scritto troppo, ed essere stato chiaro con la richiesta. Grazie in anticipo
Il concetto di composizione è veramente semplice (lo scrivo ai fini di determinare la complessità della funzione).
Guardo nella prima sostituzione se ho una variabile (x,y,z) a sinistra della / , poi nella seconda guardo se ho la stessa variabile a destra della /, se si, vado a sostituire la prima variabile con il simbolo associato alla variabile che ho trovato anche nella seconda (dove con associato intendo quello che sta a sinitra della / della variabile in questione nella seconda sostituzione). Ed infinite tolgo i legami in più (doppi), ovvero quelli che nella nuova composizione hanno la stessa variabile a destra della /.
Esempio
Constanti: abc
Variabili: xyz
Simboli di funzione: f()
s1= [b/y,y/z,f(a)/x] ed s2 = [a/y,b/z], ottengo [b/y,a/z,f(a)/x,b/z], elimino b/z,in quanto ho sia a/z che b/z,
ricavando la composizione [b/y,a/z,f(a)/x]
Quindi, a livello di programmazione, tutto ciò prevede che io cerchi degli elementi nella prima stringa, andare a vedere se sono presenti nella seconda, e sostituirli con il valore assegnato nella seconda, rimuoverne alcuni, andando così a creare una terza stringa, nuova. Sapreste consigliarmi che funzioni potrei sfruttare? E soprattutto i metodi che conviene usare per il lavoro di check dei simboli, sostituzioni e come andare ad inserirli in una nuova stringa.
Quelle che fino ad ora ho pensato potessero essere utili sono:
strcpy, strncpy, strcat e strncat. Trovo difficoltà nell'applicazione, in quanto sono confuso sul metodo che mi conviene usare. Non vorrei andare a fare un metodo mio, che mi complica solamente la faccenda.
Ps non so se sia importante, ma le stringhe le passo a funzione come *char
Spero di non aver scritto troppo, ed essere stato chiaro con la richiesta. Grazie in anticipo

Risposte
Penso che possa esserti più semplice lavorare direttamente con le stringhe come se fossero array.
Le varie funzioni all'interno di string.h non sono particolarmente efficienti per operazioni di questo tipo. Hanno almeno due difetti principali:
1. Non eseguono alcun controllo sulla lunghezza della stringa o altro.
2. Devono sempre partire dall'inizio della stringa anche quando sarebbe più comodo partire dalla fine (e si avrebbe modo di memorizzare questa fine in una operazione precedente.
Nel tuo caso, comunque, credo che sia più utile separare l'operazione in alcune fasi distinte e quindi scrivere delle funzioni per ognuna di esse. Eventualmente potrebbe essere comodo definire delle strutture dati aggiuntive. Sinceramente mi sembra che la gestione della stringa sia la cosa più semplice da fare nel tuo problema.
1. Non eseguono alcun controllo sulla lunghezza della stringa o altro.
2. Devono sempre partire dall'inizio della stringa anche quando sarebbe più comodo partire dalla fine (e si avrebbe modo di memorizzare questa fine in una operazione precedente.
Nel tuo caso, comunque, credo che sia più utile separare l'operazione in alcune fasi distinte e quindi scrivere delle funzioni per ognuna di esse. Eventualmente potrebbe essere comodo definire delle strutture dati aggiuntive. Sinceramente mi sembra che la gestione della stringa sia la cosa più semplice da fare nel tuo problema.