Newsgroup: it.comp.lang.c
Titolo: Spiegazioncina su strighe

Ciao a tutti,
vorrei che digitando una certa stringa su tastiera si avesse una certa 
risposta.
Ecco il codice che ho scritto per cercare di capire come fare:
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main() {
      char conferma[2];
      printf("Digita SI per confermare\n");
      scanf("%s",conferma);
      if(conferma=="SI")
         printf("ciao1\n");
      if(strcmp(conferma,"SI"))
         printf("ciao2\n");
      system("PAUSE");
      return 0;
}
 
Il primo if ï¿œ errato concettualmente? non ï¿œ fattibile confrontare 2 
stringhe in quel modo?
 
Il secondo if non va lo stesso, vuole il "!strcmp(conferma,"SI")" per 
funzionare, ma sinceramente non capisco il motivo
 
Grazie mille

 funzionare, ma sinceramente non capisco il motivo
Darsi ai fondamentali del liguaggio pare troppo difficile ?
2) in C le stringhe sono sequenze di 'caratteri' conclusi da
    un 'carattere' speciale (0x00=Terminatore stringa)
3) Il contronto e' case sensitive per cui se hai digitato "si"
    "Si" "sI" le due stringhe NON sono uguali.
4) e strcmp ritorna 0 SE le stringhe sono uguali, altri valori
    se diverse, per cui anche il tuo test e' errato.
     if(0==strcmp(s1,s2))
         // Le stringhe sono uguali!
     else
         // Le stringhe sono dicerse
aa.
 
 
 

 Darsi ai fondamentali del liguaggio pare troppo difficile ?
 
ci sto provando ma non ï¿œ semplicissimo ricordarsi tutto quello studiato 
al momento di applicarlo.
 
Comunque ho risolto seguendo i tuoi consigli, dapprima ponendo 
giustamente il test "if(0==strcmp(s1,s2))". A quel punto quella parte 
andava bene, solo che piï¿œ avanti il programma faceva delle cose 
incomprensibili, non mi faceva neanche la printf di un int acquisito con 
scanf, printava l'indirizzo di memoria anzichï¿œ il valore in quell'indirizzo.
 
Alla fine ho avviato il debug che mi ha segnalato un "An access 
violation ( segmentation fault)", dopo un pï¿œ ho risolto dichiarando char 
conferma[2] come char conferma[3], in pratica non c'era spazio nel 
vettore per il carattere '\0' e il programma funzionava malissimo.
 
Grazie ciao
 
 

 
 
Non ti preoccupare, nessuno si ricorda tutto.. l'importante è mettersi nelle
condizioni di avere una reference da consultare velocemente: se sei su linux,
ad esempio, basta chiamare le pagine di manuale con la funzione (nel tuo
caso "man strcmp") - altri sistemi hanno facility simili, e sono più che
utili!
 
Ciao!


 
Ti hanno giï¿œ spiegato il motivo. Quando mi trovavo ad affrontare
queste situazioni scrivevo qualcosa del genere:
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
 
int main(void)
{
     int done = 0;
     int i = 0;
     char risposta[4];
     char si[4] = {'s', 'i', '\n', '\0'};
 
     printf("Digita SI per confermare\n");
 
     do {
         fgets(risposta, sizeof risposta, stdin);
         for (i = 0; i < 4; i++)
             risposta[i] = tolower((unsigned char) risposta[i]);
         if(!strcmp(risposta, si)) {
             printf("ciao!\n");
             done = 1;
         }
     } while (!done);
 
     return 0;
}
 
Lasciami passare il codice scritto senza ulteriori (sempre opportuni)
error-checking e senza troppa furbizia..
 
Ho dichiarato `risposta' come array di 4 elementi perchï¿œ usando la
funzione fgets() - che consiglio, al posto di scanf() - il carattere
di newline '\n' presente nel buffer viene copiato nell'array e poi viene
aggiunto in coda '\0'. Quindi, usando fgets() e scrivendo per es. "no" e
premendo Invio, ti ritroveresti i caratteri {'n', 'o', '\n', '\0'}.
Il ciclo do-while ti permette di tentare all'infinito finchï¿œ non rispondi
"si" (il ciclo l'ho aggiunto piï¿œ perchï¿œ lo potrai riciclare in altri modi
per affrontare magari i diversi casi di risposta). Nota l'utilizzo della
funzione tolower() che trasforma i caratteri che inserisci in `risposta'
in minuscolo, uno per uno, e poi fa il confronto con l'array `si' (inizia-
lizzato come {'s', 'i', '\n', '\0'}). In questo modo, che tu scriva "si",
"SI", "Si", "sI", ï¿œ lo stesso, perchï¿œ appunto alla fine ti ritrovi comunque
con {'s', 'i', '\n', '\0'}. Sul perchï¿œ del cast (unsigned char) ti riporto
la classica spiegazione che ti darebbero su comp.lang.c:
 
http://benpfaff.org/writings/clc/ctype-cast.html
 
 
che ï¿œ sempre buona norma rispettare.
 
-- 
Vincenzo Mercuri