ciao a tutti
ho questo codice che mi legge un testo qualsiasi da tastiera e conta per tutti i caratteri distinti quante occorrenze son presenti.
il programma sostanzialmente funziona, ma ho due domande, la prima delle quale credo possiate rispondere senza nemmeno guardare troppo il codicecodice:/** * Programma che legge dei caratteri da tastiera * e comunica per ciascun distinto carattere quanto volte è stato * inserito. */ #include <iostream> #include <malloc.h> using namespace std; int main() { //puntatori all'ultimo elemento degli array di caratteri e di occorrenza dei caratteri char *stringpointer = (char *) malloc (sizeof(char)); int *occurrencepointer = (int *) malloc (sizeof(int)); //puntatori al primo elemento degli array di caratteri e di occorrenza degli stessi caratteri char *string = stringpointer; int *occurrence = occurrencepointer; char c; int numcaratteri = 0; bool yetDigited = false; printf("Inserire stringa, INVIO per terminare\n"); while ((c = getc(stdin)) != 10) //getc legge un carattere da tastiera. 10 = '\n' { yetDigited = false; for (int i = 0; i < numcaratteri; i++) //per tutti i caratteri distinti sinora inseriti { if (*(string + i * sizeof(char)) == c) //il carattere appena digitato è già stato inserito { yetDigited = true; int *index = occurrence + i * sizeof(int); (*index)++; //incremento la sua occorrenza break; } } //end FOR if (yetDigited) //al prossimo carattere continue; //è stato digitato un carattere nuovo *stringpointer = c; //inserisco il carattere nella sua cella di memoria stringpointer = stringpointer + sizeof(char); //passo alla cella di memoria successiva *occurrencepointer = 1; //nuovo carattere, occorrenza = 1 occurrencepointer = occurrencepointer + sizeof(int); //passo alla cella di memoria successiva numcaratteri++; //un nuovo carattere è stato inserito //aumento lo spazio a disposizione per un eventuale futuro carattere string = (char *) realloc (string, (numcaratteri+1) * sizeof(char)); occurrence = (int *) realloc (occurrence, (numcaratteri+1) * sizeof(int)); if ((string == 0) | (occurrence == 0)) { printf("Memoria non disponibile"); return 1; } } //end WHILE printf ("\nStringa inserita: %s\n", string); for (int i =0; i < numcaratteri; i ++) { char *indexcharacter = string + i* sizeof(char); int *indexoccurrence = occurrence + i* sizeof(int); cout << *indexcharacter << " " << *indexoccurrence << "\n"; } return 0; }
1 - perchè prima devo inserire il testo e poi mi esegue la printf che si trova prima del while principale scambiando l'ordine effettivo delle istruzioni?
2- a volte vaneggia inserendo un numero a caso nel conteggio. ad esempio parafrasando battiato se inserisco "vogliovedertidanzare" sul carattere i mi restituisce un contatore di 2054054260.
ecco l'output
grazie a chiunque vorrà aiutarmi, ciao!codice:vogliovedertidanzare Inserire stringa, INVIO per terminare Stringa inserita: vogliedrtanz v 2 o 2 g 1 l 1 i 2054054260 e 3 d 2 r 2 t 1 a 2 n 1 z 1

Rispondi quotando