Newsgroup: it.comp.lang.c++
Titolo: Ciclo!

Scusate, mi sapete dire perchč non esce mai dal ciclo?
Non riesco a capire, forse č anche semplice ma...
Ecco l'algoritmo:
#include <stdio.h>
#include <conio.h>
void main(void)
{
    char valore[2];
    clrscr();
    do
    {  printf("Inserisci un valore: ");
       gets(valore);
    }
    while (valore != "si");
    printf("\n\nSei uscito dal ciclo!!!Ciao!!!");
    getch();
}
--
Eliminare NOSPAM dall'indirizzo per rispondere in e-mail.
GRAZIE.

    while (valore != "si");
Direi che stai confrontando due puntatori;
probabilmente ripari sostituendo il test con strcmp(valore,"si") != 0
Ciao,
Gianfranco

     while (valore != "si");
Qui confronti l'indirizzo di valore con l'indirizzo di
una stringa costante.  I due indirizzi sono sempre
diversi.
Per confrontare le stringhe invece degli indirizzi
bisogna usare strcmp:
   while (strcmp( valore, "si" ) <> 0);
Per una soluzione senza rischi di overflow conviene
usare std::string:
  #include <iostream>
  #include <string>
  int main()
  {
    std::string valore;
    do {
      std::cout << "Inserisci un valore: ";
      std::getline( std::cin, valore );
    } while (valore != "si");
    std::cout << "\n\nSei uscito dal ciclo!!!Ciao!!!\n";
  }
	Mauro

    while (valore != "si");
                  ^^^^^^^^^^^^^^
Usa strcmp.
Paolo
-----------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
-----------------------------------------------

    while (valore != "si");
Usa la funzione stricmp all'interno delle parentesi se vuoi che il
confronto non tenga conto delle lettere maiuscole/minuscole. Tieni
presente che con il tasto di blocco delle maiuscole i valori
potrebbero anche essere SI o NO.
Bye.

 rispondere in inglese con yes o no allora e' meglio valore[3].
Ma mi sono perso qualcosa? Il valore nullo sull'ultimo elemento non si usa
più (il \0 di termine stringa)?
--
Alessandro Monti

 confronto non tenga conto delle lettere maiuscole/minuscole.
Il confronto diretto non funziona in nessun caso dato che confronta gli
indirizzi delle stringhe non i caratteri in esse contenuti. La funzione
strcmp() confronta esattamente le due stringhe tenendo conto delle
maiuscole/minuscole. Il confronto case-insensitive si ottiene con la
funzione stricmp() o strcmpi() che mi sembra non siano standard.
EMG

funzione stricmp() o strcmpi() che mi sembra non siano standard.
stricmp e' standard, strcmpi no.
Bye.

 stricmp e' standard, strcmpi no.
Non sono standard ne' l'una ne' l'altra; ne' C ne' C++.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it

Non sono standard ne' l'una ne' l'altra; ne' C ne' C++.
A me l'help in linea del Borland C++ mi da' che stricmp e' standard
ANSI C e ANSI C++ (ed e' portabile su Unix su Windows e su OS/2).
strcmpi invece e' una semplice macro ed e' scarsamente portabile.
Scegli tu ora a chi devo credere.
Bye.

 writes:

Non devo essere _io_ a scegliere a chi puoi credere _tu_; ma immagino
che, parlando di Standard (ovvero di un documento scritto nero su
bianco), tu debba consultare tale documento e non l'help di un
compilatore.
Guarda, piu' esattamente, nella sezione 7.11: sotto 7.11.2, titolo
"copy functions", sono nominate memcpy, memmove, strcpy, strncpy;
sotto 7.11.3, "concatenation functions", strcat e strncat; sotto
7.11.4, "comparison functions", trovo memcmp, strcmp, strcoll,
strncmp, strxfrm; sotto 7.11.5, "search functions", ci sono memchr,
strchr, strcspn, strpbrk, strrchr, strspn, strstr, strtok; sotto
7.11.6, "miscellaneous functions", sono nominate memset, strerror e
strlen.
Nella tua copia dello `Standard, dove e' definita esattamente stricmp e
dove e' nominata strcmpi?
Anche "scarsamente portabile" mi sembra un ossimoro: una cosa o e'
portabile o non lo e', senza vie di mezzo.  Mi ricorda la storia della
ragazza che per, farsi perdonare dai genitori, gli disse di essere
si incinta --- ma di un bimbo molto piccolo.


si incinta --- ma di un bimbo molto piccolo.
Per scarsamente portabile intendevo dire che e' supportata solo su
alcuni ambienti (Dos, Unix, Win32, OS/2) giusto per compatibilita',
sempre secondo l'help del borland.
Per quanto riguarda la ragazza incinta esiste l'aborto in Italia,
l'hanno inventato, ed e' ben documentato (Standard? :-)))).
P.S. Certo che con voi universitari e' sempre una discussione :-)))).
Bye.

P.S. Certo che con voi universitari e' sempre una discussione :-)))).
Siamo il lato buono della forza!   :)
O quasi...


Lo standard invece e` comunque il riferimento ufficiale.
Penso che l'help contenga un errore mentre il compilatore sia gia'
allineato allo standard, almeno in questo caso. Basta vedere la
dichiarazione delle funzioni stricmp e strcmpi nel file "string.h" per
averne la conferma:
#if !defined(__STDC__)
/* compatibility with other compilers */
#define strcmpi(s1,s2)      stricmp(s1,s2)
#define strncmpi(s1,s2,n)   strnicmp(s1,s2,n)
#endif  /* !__STDC__ */
Neanche a dirlo anche la funzione stricmp e' inclusa all'interno del
defined (insieme a molte altre).
Penso quindi di capire che definendo l'identificatore __STDC__ il
compilatore includa solo le funzioni definite dallo standard (e
pertanto scarta quelle definite all'interno di tale defined).
Per quanto riguarda l'help ho dato uno sguardo ai manuali della
versione 3.1 del compilatore ed infatti le funzioni stricmp e strcmpi
non sono affatto standard (sono usate solo per dos e windows).
Vi ringrazio per la pazienza che avete avuto e spero che la Borland in
futuro (anzi gia' da ora con il Builder) fornisca una informazione
assai piu' precisa, giusto per evitare ad altri utenti di ripetere i
miei errori.
Bye.