PDA

View Full Version : [C]problema con struttuta di controllo if else


viridovix1
11-08-2005, 13:15
IL codice in C gira sotto Linux 9.2, compilatore gcc.
Si tratta sempre di un client e server connessi tra loro tramite socket, con protocollo tcp.

qui riporto la parte del server con la struttura if:



char x[1024],y[1024];
unsigned char z,w;
char buf[1024];
char buf2[1024];
do
{
send(ds_sock_acc,"\nInserisci fila :",20,0);
recv(ds_sock_acc,&x,2,0);
printf("%s",&x);
if ((strcmp(x,"A")!=0)||(strcmp(x,"B")!=0)||(strcmp(x,"C")!=0))
{
send(ds_sock_acc,"\nfila inesistente\n",30,0);
}
else (strcpy(buf,"fatto"));
}
while (strcmp(buf,"fatto")!=0);


purtroppo nn so perchè questo nn funziona :
if ((strcmp(x,"A")!=0)||(strcmp(x,"B")!=0)||(strcmp(x,"C")!=0))

se inserisco dal client il carattere A o B o C comunque sia il sever spedisce il messaggio fila inesistente.

modificando cosi' riconosce invece ol carattere A:

if ((strcmp(x,"A")!=0)
{
send(ds_sock_acc,"\nfila inesistente\n",30,0);
}

ma ovviamente nn mi fa gli altri confronti
se modifico ulteriormente cosi

if ((strcmp(x,"A")!=0)
{
send(ds_sock_acc,"\nfila inesistente\n",30,0);
}

else if (strcmp(x,"B")!=0)
{
send(ds_sock_acc,"\nfila inesistente\n",30,0);
}

ritorno al problema iniziale qualsiasi carattrere invio da client poi il server spedisce il messaggio fila inesistente.

nn riesco a capire dove sia la magagna :(

cagnulein
11-08-2005, 13:17
dico forse una stupidata, hai provato a mettere al posto di "A" -> 'A' e via discorrendo?

Fammi sapere

Ziosilvio
11-08-2005, 14:08
Non ho capito bene quello che vuoi fare, ma ti ricordo che strcmp restituisce il valore 0 quando i suoi argomenti sono due stringhe uguali.

cionci
11-08-2005, 14:08
(strcmp(x,"A")!=0)||(strcmp(x,"B")!=0)||(strcmp(x,"C")!=0)

Questa espressione è sempre vera... Se anche uno dei tre strcmp ritorna 0 (ricorda che strcmp ritorna 0 quando il primo parametro è uguale al secondo) gli altri due ritornano -1 o +1...quindi l'or ha sempre 1 come risultato...

kapo04
11-08-2005, 23:48
Se ho capito, quello che intendi fare è che quando inserisci A, B, oppure C il server mandi in output: "fatto"..
Quindi se questo è quello che vuoi fare, potresti modificare il codice cosi:

if ((strcmp(x,"A")==0)||(strcmp(x,"B")==0)||(strcmp(x,"C")==0))
{
strcpy(buf,"fatto");
}
else send(ds_sock_acc,"\nfila inesistente\n",30,0);

In questo modo se una delle tre strcmp() nella condizione dell'if è vera, allora l'operazione eseguita sarà la strcpy(), altrimenti l'else successivo.
Spero di esserti stato d'aiuto :)

viridovix1
12-08-2005, 01:55
avete perfettamente ragione , sono stato un vero allocco :doh:

Ho corretto cosi:

if ((strcmp(x,"A")==0)||(strcmp(x,"B")==0)||(strcmp(x,"C")==0))
{ (strcpy(buf,"fatto"));
}
else send(ds_sock_acc,"\nfila inesistente\n",30,0);

ora va :D
Grazie