Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - invare falso messaggio di errore
Forum - C/C++ - invare falso messaggio di errore

Avatar
LgK_DaRk (Normal User)
Newbie


Messaggi: 3
Iscritto: 07/10/2007

Segnala al moderatore
Postato alle 1:06
Domenica, 07/10/2007
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?

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 11:14
Domenica, 07/10/2007
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.

Codice sorgente - presumibilmente C++

  1. #define STRICT
  2. #define WIN32_LEAN_AND_MEAN
  3.  
  4. #include <windows.h>
  5. #include <string>
  6. using namespace std;
  7. [...]
  8. string testo;
  9. getline(cin, testo);
  10. MessageBox(NULL, testo.c_str(), "Error", MB_OK);
  11. [...]



puù info sulla MessageBox sono qui:
http://msdn2.microsoft.com/en-us/library/ms645505.aspx

PM Quote
Avatar
LgK_DaRk (Normal User)
Newbie


Messaggi: 3
Iscritto: 07/10/2007

Segnala al moderatore
Postato alle 12:17
Domenica, 07/10/2007
Testo quotato

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.

Codice sorgente - presumibilmente C++

  1. #define STRICT
  2. #define WIN32_LEAN_AND_MEAN
  3.  
  4. #include <windows.h>
  5. #include <string>
  6. using namespace std;
  7. [...]
  8. string testo;
  9. getline(cin, testo);
  10. MessageBox(NULL, testo.c_str(), "Error", MB_OK);
  11. [...]




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

PM Quote
Avatar
WARRIOR (Ex-Member)
Guru


Messaggi: 627
Iscritto: 30/03/2007

Segnala al moderatore
Postato alle 18:58
Domenica, 07/10/2007
Testo quotato

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.

Testo quotato


- #define STRICT
- #define WIN32_LEAN_AND_MEAN



Sono due macro definite in <windows.h>.

:k:

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 16:08
Lunedì, 08/10/2007
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"

Testo quotato


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 il 08/10/2007 alle 16:16
PM Quote