07/10/07 9:14
netarrow
ti mostro in C++, come premessa ti dico di scordare la funziona gets che è la più bacata al mondo, e quando si usa C++ si può evitare di reinventarsi le stringhe con i puntatori a carattere perchè c'è la classe string.
puù info sulla MessageBox sono qui:
msdn2.microsoft.com/en-us/library/…
#define STRICT #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <string> using namespace std; [...] string testo; getline(cin, testo); MessageBox(NULL, testo.c_str(), "Error", MB_OK); [...]
puù info sulla MessageBox sono qui:
msdn2.microsoft.com/en-us/library/…
aaa
07/10/07 10:17
LgK_DaRk
Postato originariamente da netarrow:
ti mostro in C++, come premessa ti dico di scordare la funziona gets che è la più bacata al mondo, e quando si usa C++ si può evitare di reinventarsi le stringhe con i puntatori a carattere perchè c'è la classe string.
ti mostro in C++, come premessa ti dico di scordare la funziona gets che è la più bacata al mondo, e quando si usa C++ si può evitare di reinventarsi le stringhe con i puntatori a carattere perchè c'è la classe string.
#define STRICT #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <string> using namespace std; [...] string testo; getline(cin, testo); MessageBox(NULL, testo.c_str(), "Error", MB_OK); [...]
grazie mille! cmq xke hai detto che gets è bacata? devo usare getline?
nel codice che hai messo, a che serve:
- using namespace std;
- #define STRICT
- #define WIN32_LEAN_AND_MEAN
- testo.c_str()
sono funzioni proprio del c++ vero? non del c..
aaa
07/10/07 16:58
WARRIOR
Postato originariamente da LgK_DaRk:
grazie mille! cmq xke hai detto che gets è bacata? devo usare getline?
nel codice che hai messo, a che serve:
- using namespace std;
- #define STRICT
- #define WIN32_LEAN_AND_MEAN
- testo.c_str()
sono funzioni proprio del c++ vero? non del c..
grazie mille! cmq xke hai detto che gets è bacata? devo usare getline?
nel codice che hai messo, a che serve:
- using namespace std;
- #define STRICT
- #define WIN32_LEAN_AND_MEAN
- testo.c_str()
sono funzioni proprio del c++ vero? non del c..
gets è una funzione del C.
c_str, se non mi sbaglio serve a generare una stringa in stile C.
Beh, il namespace per dirla grossolanamente, serve a memorizzare tutti i nomi usati per variabili, funzioni ecc. in una parte di memoria e quindi evitare contrasti tra i nominativi assegnati.
- #define STRICT
- #define WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN
Sono due macro definite in <windows.h>.
aaa
08/10/07 14:08
netarrow
la gets è l'esempio per antonomasia di buffer
overflow, quindi se l'utente inserisce una stringa ben studiata può pastrocciare sullo stack fare degli exploit e eseguire codice arbitrario (il tuo non sarà un programma chissà che importante che magari gira come servizio coi permessi root, però è bene imparare a usare codice corretto subito).
In generale le funzioni per operare sulle stringhe intese come char* in C sono bacate sempre da buffer overflow, format string bug e tanti altri errori (non a caso sistemi come openbsd le reimplementa correggendo questi problemi), se usi una di queste:
strcpy
lstrcpy
lstrcpyA
lstrcpyW
lstrcpyn
lstrcpynA
lstrcpynW
wstrcpy
strncpy
wstrncpy
sptrintf
swptrinf
gets
getws
strcat
lstracat
lstrcatW
wcscat
strncat
wstrncat
memcpy
memmove
scanf
wscanf
fgets
il tuo programma sarà a rischio bug; inoltre è più "bestemmioso" stare a reinventarsi le stringhe con i puntatori a carattere; alcuni tireranno fuori la storia delle performance, ma oltre che più sicuro è meglio usare codice scritto al meglio interno allo standard C++ che usare codice proprio C scritto molto probabilmente male, e poi coi PC di oggi non si nota tutta questa differenza.
Per quanto riguarda c_str() bisogna tenere conto che per dare compatibilità al vecchio codice scritto in C o che cmq adotta il vecchio stile char* bisogna dare un sistema per tornare indietro da string a char*, ed ecco quindi il metodo c_str(); e nonostante il passo avanti con la classe string, di default "" è char* (dal D finalmente "" è classe string)
Per le define di win, STRICT non ricordo cosa serve ricordo però che la guida che avevo letto sull win32 api indicava quei 2 define come "prologo", mentre WIN32_LEAN_AND_MEAN serve a dire a windows.h di non includere delle fu nzionalità usate di rado, ma quindi solo "lo stretto indispensabile"
Per fare certe cose C++ deve appoggiarsi direttamente alle API del sistema operativo o indirettamente tramite librerie di terzi.
Quindi sono proprie del C++ e non del c il namespace std, la classe string e il suo metodo c_str
windows.h è un header di windows per utilizzare le sue funzioni, costanti, variabili ecc... con il C++
overflow, quindi se l'utente inserisce una stringa ben studiata può pastrocciare sullo stack fare degli exploit e eseguire codice arbitrario (il tuo non sarà un programma chissà che importante che magari gira come servizio coi permessi root, però è bene imparare a usare codice corretto subito).
In generale le funzioni per operare sulle stringhe intese come char* in C sono bacate sempre da buffer overflow, format string bug e tanti altri errori (non a caso sistemi come openbsd le reimplementa correggendo questi problemi), se usi una di queste:
strcpy
lstrcpy
lstrcpyA
lstrcpyW
lstrcpyn
lstrcpynA
lstrcpynW
wstrcpy
strncpy
wstrncpy
sptrintf
swptrinf
gets
getws
strcat
lstracat
lstrcatW
wcscat
strncat
wstrncat
memcpy
memmove
scanf
wscanf
fgets
il tuo programma sarà a rischio bug; inoltre è più "bestemmioso" stare a reinventarsi le stringhe con i puntatori a carattere; alcuni tireranno fuori la storia delle performance, ma oltre che più sicuro è meglio usare codice scritto al meglio interno allo standard C++ che usare codice proprio C scritto molto probabilmente male, e poi coi PC di oggi non si nota tutta questa differenza.
Per quanto riguarda c_str() bisogna tenere conto che per dare compatibilità al vecchio codice scritto in C o che cmq adotta il vecchio stile char* bisogna dare un sistema per tornare indietro da string a char*, ed ecco quindi il metodo c_str(); e nonostante il passo avanti con la classe string, di default "" è char* (dal D finalmente "" è classe string)
Per le define di win, STRICT non ricordo cosa serve ricordo però che la guida che avevo letto sull win32 api indicava quei 2 define come "prologo", mentre WIN32_LEAN_AND_MEAN serve a dire a windows.h di non includere delle fu nzionalità usate di rado, ma quindi solo "lo stretto indispensabile"
sono funzioni proprio del c++ vero?
Per fare certe cose C++ deve appoggiarsi direttamente alle API del sistema operativo o indirettamente tramite librerie di terzi.
Quindi sono proprie del C++ e non del c il namespace std, la classe string e il suo metodo c_str
windows.h è un header di windows per utilizzare le sue funzioni, costanti, variabili ecc... con il C++
Ultima modifica effettuata da netarrow 08/10/07 14:16
aaa