Da stringa con parola a stringa con ascii

di il
9 risposte

Da stringa con parola a stringa con ascii

Salve a tutti... ho un file txt con all'interno delle parole, es. "aa\n aab\n cbb\n den\n" etc etc. Me le prendo nel programma come stringhe, e vorrei convertirle in ASCII e salvarle all'interno di un'altra stringa (o meglio sarebbe di un numero) in modo da poter poi confrontarli e vedere quale parola è quella che si ripete più spesso. sono stato capace di visualizzare un numero diverso per ogni stringa (anche se non so cosa sia nel caso di stringhe più lunghe di 1, non è come pensavo la concatenazione degli ASCII, ma poco importa), ma non riesco a trovare il modo di salvare questo numero da qualche parte...

#include <stdio.h>
#include <string.h>

int main() {
	FILE *fd;
	fd=fopen("prova.txt", "r");
	int valore[4];
	char parola[18], c;

	do {
	fscanf(fd, "%s", valore);
	printf("Parola: %s \n", valore);

	int i, z;
    z = 0;
    for(i = 0; i < strlen(valore); i++) {
      z = valore[i];
			printf("%ld", z);
		}
		printf("\n");
	} while(c=getc(fd)!=EOF);


	fclose(fd);

}

9 Risposte

  • Re: Da stringa con parola a stringa con ascii

    In realtà le stringhe contengono già dei valori ascii.
    Ad esempio, la stringa "aa" è rappresentata in memoria con tre byte di valore 97, 97 e 0 (il terminatore).
    Se devi confrontare delle stringhe usa strcmp().
  • Re: Da stringa con parola a stringa con ascii

    Giusto... Ma quando vado a visualizzare a schermo gli ascii di quella stringa, ottengo un ascii di sicuro se la stringa è di una lettera (con a ottengo 97) ma con due lettere, cosa visualizzi allora? Se fosse aa la parola, non dovrei ottenere 9797? Invece ottengo 265 (o qualcos'altro, non ricordo esattamente). E come faccio a salvare quegli ascii della stringa in una singola posizione di un array (o stringa di stringhe) per fare il confronto?
  • Re: Da stringa con parola a stringa con ascii

    Non ho capito nulla ... ma che intendi dire?

    E che senso ha questo

    fscanf(fd, "%s", valore);

    dato che valore è un vettore di int ?

    Forse fai un po' di confusione tra i tipi di dati in C ...
  • Re: Da stringa con parola a stringa con ascii

    Se fosse aa la parola, non dovrei ottenere 9797? Invece ottengo 265 (o qualcos'altro, non ricordo esattamente).
    dovresti ottenere 9797; se ottieni un valore diverso posta l'output del tuo programma.
    E come faccio a salvare quegli ascii della stringa in una singola posizione di un array (o stringa di stringhe) per fare il confronto?
    Ripeto: ce li hai già in una stringa.
    Se tu volessi confrontare i valori di stringhe brevi potresti utilizzare un int; su sistema a 32 bit potresti memorizzare 4 caratteri mentre su sistemi a 64 bit riusciresti a memorizzare 8 caratteri; il punto è che così puoi confrontare solo stringhe di max 4 o 8 caratteri.
    L'unico senso che potrebbe avere una scelta di questo tipo è prestazionale, ma di sicuro non è una strcmp() il collo di bottiglia dal momento che stai caricando i dati da un file!
  • Re: Da stringa con parola a stringa con ascii

    Ho provato ora il tuo programma; non ottieni 9797 perchè 'valore' è un array di interi mentre deve essere un array di char (ovvero stringa).
    Il valore strano lo ottieni perchè carichi l'array come "stringa" ovvero un byte alla volta e poi lo vai a leggere un int (4 o 8 byte) alla volta.
  • Re: Da stringa con parola a stringa con ascii

    Ok, giusto, con char visualizzo tutto correttamente! ora il mio problema è capire come fare a trovare la parola che si ripete più spesso nel file... strcmp posso usarlo per confrontre la parola che si ripete di più con le altre, e incremento un contatore che aumenta ogni volta che la incontra nuovamente, ma prima devo trovarla :/
  • Re: Da stringa con parola a stringa con ascii

    La prima cosa che devi fare è caricare il file in memoria, ovvero leggerlo riga per riga e caricare un array di stringhe (ovvero matrice di caratteri).
    Fatto questo devi scorrere questa "lista" e per ciascuna stringa contare quante stringhe uguali seguono; se il conteggio è maggiore al massimo corrente (che sarà inizialmente -1) ti tieni traccia della posizione e aggiorni il massimo corrente; alla fine avrai la posizione (quindi puoi estrarre la stringa) con il numero massimo di ripetizioni.
    Poi su questo puoi costruire migliaia di varianti, più o meno ottimizzate, ma intanto realizza una versione e falla funzionare; ti servirà come base per ulteriori miglioramenti e variazioni.
    Buon lavoro!
  • Re: Da stringa con parola a stringa con ascii

    Penso di aver capito quasi tutto.. a parte il come caricare un array di stringhe
  • Re: Da stringa con parola a stringa con ascii

    Esistono diversi esempi cercando su Internet.
    Quello che mi sento di consigliarti è di evitare di scrivere tutto nel main(): la cosa migliore è quella di scrivere delle funzioni, una per il caricamento della "lista" da file, una per la visualizzazione della lista e una per la determinazione della stringa più frequente. In questo modo se il caricamento da file rappresenta un ostacolo puoi predisporre la funzione di caricamento da file che invece di leggere da file carica la "lista" con delle stringhe fisse, con una serie di strcpy().
Devi accedere o registrarti per scrivere nel forum
9 risposte