smalldragon ha scritto:
ci avevo già pensato a riscrivere la cin e la cout ma pultroppo non ho le conoscenze sufficienti per poterlo fare!
Di per se la cout non da molti problemi e sicuramente meno della cin. Comunque puoi partire dalle primitive del C o delle API Windows se non ti interessa la portabilità.
In C per l'output puoi usare puts() che stampa stringhe pure,
http://www.cplusplus.com/reference/clibrary/cstdio/puts/
per l'input puoi usare fgets()
http://www.cplusplus.com/reference/clibrary/cstdio/fgets/
per acquisire una stringa di n caratteri, usando stdin come ultimo parametro.
Usando l'allocazione dinamica della stringa, puoi avere l'input lungo quanto vuoi.
In ambedue i casi dovrai stabilire un criterio per le procedure di conversione dati a stringa per l'output o da stringa a dati per l'input.
Per esempio, puts() accetta solo const char* per cui se in uscita vuoi avere "ciao 1234", dove 1234 ti arriva come valore int, non puoi fare: puts("ciao"); puts(1234). Dovrai prima convertire 1234 in const char* usando o una funzione di libreria o una funzione fatta da te.
Lo stesso vale a rovescio.
Se non ti interessa la portabilità, le API Windows sono: WriteConsoleA
(nota che vuole sapere il numero di caratteri da scrivere)
ReadConsoleA
da usare più o meno nello stesso modo dopo aver ottenuto l'handle da GetStdHandle
nella mia povera funzione InsRightParola
char *cptr e char *dptr ; sono dei puntatori a stringa ma vanno bene anche per i buffer
sinceramente non vedo la convenienza di utilizzare un puntatore ad un singolo carattere.
Non è che devi vederne la convenienza: devi vederne il potenziale problema. Chiamare quella funzione passando un puntatore a un singolo carattere è lecito, ma non ha senso. Al linguaggio però non interessa se ha senso o no la chiamata, ma solo se è fattibile o meno.
la funzione non fa niente altro che aggiungere la stringa dptr alla fine della stringa cptr.
il dover passare ogni volta le dimensioni delle stringhe sinceramente è una cosa assurda
non tanto per questa funzione che unisce semplicemente 2 stringhe ma metti caso che ci fossero 10 stringhe da unire sarebbe assurdo ed ingestibile passargli 20 parametri.
A dire il vero sarebbe assurdo creare una funzione con 10 stringhe: basta ripetere 10 la stessa funzione. Comunque stai facendo un errore di fondo: l'unica stringa di cui devi passare la lunghezza è quella in cui devi scrivere, non quella da cui leggi.
Convenzionalmente, nelle funzioni che trattano ASCIIZ string, il parametro da cui leggere è const char*, per cui appena si vede tale parametro si capisce già che:
1) non viene toccato
2) la lunghezza si determina con strlen(), se il parametro non è NULL.
non che poi il fatto che normalmente le stringhe vengono sovradimensionate per evitare facili sfondamenti.
Questo perché in C le stringhe sono array di char NULL terminated (ripeto: NULL terminated. E' fondamentale questo!) e le routine di manipolazione dei buffer erano più semplici da esplicitare in ASM (invece di creare un dato di tipo nuovo).
In C++ questo è risolto dalla classe std::string.
anche per questo occorrerebbe un sistema per controllare le dimensioni all'interno delle funzioni.
Ti ripeto che non è possibile fare questo senza indicare a priori le dimensioni della zona valida. Quando si sfora la zona valida il comportamento è indefinito e questo significa che non sempre si ha un crash. Puoi non avere crash una volta, due volte, n volte; ma alla n+1 si pianta tutto.
Altre volte funziona due colpi e il terzo no. E' random la cosa.
Non mi pare sia possibile nemmeno in ASM: perché dovrebbe esserlo in C che è stato pensato per essere un ASM portatile tra le varie architetture di CPU?
per quanto riguarda l'assembler ti consiglio vivamente di impararlo e un linguaggio bellissimo ed anche semplicissimo.
Non lo nego, ma il tempo è quel che è. Senza contare che di ASM c'é né uno per CPU, DSP, PIC etc...
Non si sa mai comunque.