PDA

View Full Version : [C] comparazione di stringhe


teppista83
28-08-2007, 18:05
una domanda che epr molto potrebbe sembrare banale ma in linguaggio c voglio vedere se due stringhe sono uguali

girando su internet e sfogliando il manuale di c ho visto che e' possibile farlo con il comando strcmp che logicamnete utilizza la libreria string.h.
allora se nella chiamata voglio comparare due stringhe scrivo:
temp=strcmp(stringa1,"0")

in pratica voglio vedere se la stringa1 e' uguale alla stringa "0".
e metto il risultato di tale comparazione nella variabile intera temp visto che il comando strcmp restituisce -1 se la prima stringa e' minore della seconda, 0 se le stringhe sono uguali e 1 se la seconda e' piu' grande della prima.

sperando di non aver sbagliato qualcosa fino ad adesso attendo una risposta

andbin
28-08-2007, 19:01
girando su internet e sfogliando il manuale di c ho visto che e' possibile farlo con il comando strcmp che logicamnete utilizza la libreria string.h.string.h non è una libreria, è un file di header.
Comunque sì, strcmp serve per confrontare due stringhe.

allora se nella chiamata voglio comparare due stringhe scrivo:
temp=strcmp(stringa1,"0")

in pratica voglio vedere se la stringa1 e' uguale alla stringa "0".
e metto il risultato di tale comparazione nella variabile intera temp visto che il comando strcmp restituisce -1 se la prima stringa e' minore della seconda, 0 se le stringhe sono uguali e 1 se la seconda e' piu' grande della prima.A dire il vero non è detto che sia +1 o -1. Le varie documentazioni dicono:

un valore < 0 se s1 < s2
un valore 0 se s1 = s2
un valore > 0 se s1 > s2

sperando di non aver sbagliato qualcosa fino ad adesso attendo una rispostaLa domanda quale è? Se è corretto? Sì.

teppista83
28-08-2007, 19:40
la domanda e' :
come faccio a controntare la stringa string1 e la stringa "0"??non me lo fa

cionci
28-08-2007, 19:48
Per favore la prossima volta metti il linguaggio fra parentesi quadre prima del titolo della discussione ;)

Doriän
28-08-2007, 20:33
la domanda e' :
come faccio a controntare la stringa string1 e la stringa "0"??non me lo fa


posteresti il codice che hai scritto? Potrebbe essere d'aiuto per risolvere il tuo problema! Perché teoricamente il ragionamento è giusto!

teppista83
28-08-2007, 22:36
if ((strcmp(stringa,"0"))==0) printf("trovato\n");
else printf(" non Trovato\n");

mi da errore su strcmp(stringa,"0") ma a livello di sintassi non dovrebbe essere sbagliato perche la variabile stringa contiene il valore 0 e quindi dovrebbe fare il controllo...ma non me lo fa

teppista83
28-08-2007, 22:39
cionci chiedo venia per l'errore non lo sapevo

nico88desmo
28-08-2007, 22:45
if ((strcmp(stringa,"0"))==0) printf("trovato\n");
else printf(" non Trovato\n");

mi da errore su strcmp(stringa,"0") ma a livello di sintassi non dovrebbe essere sbagliato perche la variabile stringa contiene il valore 0 e quindi dovrebbe fare il controllo...ma non me lo fa

Che tipo di errore ti dà?

Doriän
28-08-2007, 22:55
Curioso. A me compila e funziona alla perfezione.
Il valore di stringa viene stabilito a priori da te in fase di programmazione o è inserito in runtime?

teppista83
29-08-2007, 07:58
il valore di stringa e' una stringa costruita da me perche dovendo fare una ricerca utilizzo una grep e fin qui ci siamo perche la ricerca la fa. alla fine del grep il risultato di stringa e' 0 se ha trovato cio' che cercavo ma quando vado a comparare il valore stringa(che poi è 0) con la stringa "0" non mi esce nulla nel senso che poiche a seconda del valore della comparazione dovrebbe stampare o
"ho trovato" oppure "non ho trovato" non mi esce nessuna stampa a video. e non capisco perche

cionci
29-08-2007, 09:49
Allora l'errore è altrove ;) Anche perché a parte le parentesi in più nell'if (ininfluenti) mi sembra che vada tutto bene e qualcosa ti deve stampare ad ogni costo.
Hai provato a seguire l'esecuzione con un debbugger ?
Dimmi eventuale ambiente di sviluppo, compilatore e sistema operativo.

teppista83
29-08-2007, 10:08
utilizzo la shell dell'universita' e uso putty come ambiente di lavoro che gira su win xp

adesso pero' mi sta vendendo un altro problema:

se scrivo
fdm=open("morte",O_RDONLY);
read(fdm,nonesiste,1);

il file morte contiene solo uno 0

perche' dopo aver fatto la read se faccio stampare il valore di nonesiste mi stampa 01?

bjt2
29-08-2007, 19:35
Non sono sicuro che tutti i compilatori accettino costanti stringa come parametri di una funzione...

Hai provato a dicharare lo "0" che passi a strcmp come

char *zero="0";


e poi scrivere

if((strcmp(stringa,zero)==0) ...

?

cionci
29-08-2007, 19:44
Non sono sicuro che tutti i compilatori accettino costanti stringa come parametri di una funzione...

Credo proprio di sì...

wingman87
30-08-2007, 00:33
utilizzo la shell dell'universita' e uso putty come ambiente di lavoro che gira su win xp

adesso pero' mi sta vendendo un altro problema:

se scrivo
fdm=open("morte",O_RDONLY);
read(fdm,nonesiste,1);

il file morte contiene solo uno 0

perche' dopo aver fatto la read se faccio stampare il valore di nonesiste mi stampa 01?
Posta tutto il codice

teppista83
30-08-2007, 09:53
#include<fcntl.h>
#include <stdio.h> // per printf e scanf
#include <string.h> // per strcat
#include <sys/types.h>
#include <stdlib.h>

int main(void)


{
int flag;
char nome[15],path[20];
printf("Dammi il nome\n");
scanf("%s",&nome);
printf("Dove devo cercare\n");
scanf("%s",&path);

flag=ricerca(nome,path);
}



int ricerca (char *nome, char *path)
{
int fd,fdm,esiste;
char buf[1],nonesiste[1]="";
char stringa[100]="";
strcat(stringa,"egrep -i ^");
strcat(stringa,nome);
strcat(stringa,"$ ");
strcat(stringa,path);
strcat(stringa," | wc -w ");
system(stringa);
fd=open("trovato",O_RDONLY);
read(fd,buf,1);
fdm=open("morte",O_RDONLY);
read(fdm,nonesiste,1);
printf("il valore d;i buf %s il valore di inesistente %s \n",buf,nonesiste);
esiste=strcmp(buf,nonesiste);
printf("il valore di esiste %d \n",esiste);
// if (esiste==0) printf("Non trovato\n");
// else printf("Trovato\n");
exit(0);

}

quando stampa il valore di buf mi stampa il puntatore invece a me serve il valore...cmq il codice funziona bene fino a "system(stringa)"

cionci
30-08-2007, 10:04
Perché lavori sulle stringhe quando ti basterebbe lavorare sui caratteri ?
Inoltre il codice è concettualmente sbagliato perché non tieni conto del carattere di fine stringa. In C non esistono stringhe di un solo elemento (a meno che non sia una stringa vuota). La stringa minima è formata da un carattere + il carattere di fine stringa.
Quindi se vuoi lavorare con le stringhe dei fare questa impostazione:

char buf[2],nonesiste[2];

nonesiste[1] = buf[1] = '\0'; /*carattere di fines stringa*/

In questo modo funziona perché leggi dal file il carattere 0 delle rispettive stringhe.
Comunque come ti dicevo sopra non ti servono le stringhe.
Basta leggere un char singolo e poi confrontarlo.

teppista83
30-08-2007, 12:30
ma io la stringa "stringa" la devo usare per forza per crearmi il comando di grep da mettere in system altrimenti non mi fa la ricerca...tu dici di non usare la stringa quando parlo di "buf" e "nonesiste"?

cionci
30-08-2007, 13:03
ma io la stringa "stringa" la devo usare per forza per crearmi il comando di grep da mettere in system altrimenti non mi fa la ricerca...tu dici di non usare la stringa quando parlo di "buf" e "nonesiste"?
Sì...proprio per quelle due.