Oppure

Loading
06/10/07 23:06
LgK_DaRk
Ciao!
sono nuovo su questo forum, che a mio parere è uno dei piu buoni che si trovino..

vorrei fare un programma che getsata una stringa da tastiera -[gets(string)]- mi mandi un falso errore su window cn la stringa come descrizione...

questo in C o C++

mi pare che in VB si possa fare no, è fattibile?
aaa
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.

#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.

#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..


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


Sono due macro definite in <windows.h>.

:k:
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 :D 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