Variabili d'ambiente in C

Snalez

Nuovo Utente
Ciao a tutti è da giorni che sto cercando di capire come risolvere questo esercizio:

Si definisca una variabile di ambiente MY_FILE che abbia valore uguale al nome di un file presente nella directory corrente. Si scriva un programma che conti il numero di occorrenze di ogni carattere all’interno del file il cui nome è nella variabile di ambiente MY_FILE. Per ogni carattere presente nel file, viene stampato il codice ASCII in esadecimale e il numero di occorrenze.

Quello che non capisco è come creare e utilizzare la variabile d'ambiente MY_FILE. Il resto sono riuscito a farlo così:
C:
#include <stdlib.h>
#include <stdio.h>

#define LENGTH 89
void esadecimale(int cast);
char percorso[LENGTH] = "/home/lorenzo/Scrivania/SO/Esercizi/Es. T2/ciao.txt";
int main(){
    char s[LENGTH], t;
    int a, i, j, cont, resto;
    FILE *pf ;
    pf = fopen (percorso, "r") ;
    if (pf){
        while (!feof (pf))
            fgets(s, sizeof(s), pf);
    }else
        printf ("errore durante l’ apertura del file.");
   for(t = '!'; t < 'z'; t++){
        cont = 0;
        for(i = 0; i < sizeof(s) && s[I] != '\0'; i++){
            if(s[I] == t)
                cont++;
        }
        if(cont != 0){
            printf("%d, %c", cont, t);
            printf(" [");
            resto = 1;
            int cast = (int) t;
            esadecimale(cast);
            printf("]\n");
        }
    }
  
}
void esadecimale(int cast){
    if(cast % 16 != 0){
        if(cast % 16 == 10){
            esadecimale(cast/16);
            printf("A");  
        }else if(cast % 16 == 11){
            esadecimale(cast/16);
            printf("B");
        }else if(cast % 16 == 12){
            esadecimale(cast/16);
            printf("C");
        }else if(cast % 16 == 13){
            esadecimale(cast/16);
            printf("D");
        }else if(cast % 16 == 14){
            esadecimale(cast/16);
            printf("E");
        }else if(cast % 16 == 15){
            esadecimale(cast/16);
            printf("F");
        }else{
            esadecimale(cast/16);
            printf("%d", cast%16);
        }
    }
}
 

Andretti60

Utente Èlite
3,676
2,459
Hardware Utente
Ci sono parecchi errori nel tuo codice, specie nell'utilizzo e definizione del vettore "s" e nel fatto che non conti le occorrenze dei diversi caratteri, ma la variabile richiesta nell'esercizio è la stessa che tu hai usato nel tuo codice "percorso", che devi inizializzare usando una variabile di "ambiente" (che non ho mai sentito tradurre in italiano) invece che inizializzala staticamente come hai fatto tu
https://it.m.wikipedia.org/wiki/Variabile_d'ambiente
 
  • Mi piace
Reactions: Snalez

Snalez

Nuovo Utente
Ci sono parecchi errori nel tuo codice, specie nell'utilizzo e definizione del vettore "s"
Cioè? Cos'è sbagliato? E' un array di caratteri. Potresti spiegarmi meglio?
e nel fatto che non conti le occorrenze dei diversi caratteri
Sì che le conto, hai provato ad eseguire il codice?
la variabile richiesta nell'esercizio è la stessa che tu hai usato nel tuo codice "percorso", che devi inizializzare usando una variabile di "ambiente" (che non ho mai sentito tradurre in italiano) invece che inizializzarla staticamente come hai fatto tu
Come si fa?

Scusa ma è da poco che programmo in C, molte cose ancora non mi sono chiare.
 

Andretti60

Utente Èlite
3,676
2,459
Hardware Utente
Il tuo codice è così convoluto che non lo avevo capito. Perché conti solo le occorrenze dei caratteri da ! a z? Dovresti considerare tutti i caratteri da 0 a 255.
Per stampare il codice esadecimale esiste già un codice della formattazione usato nella printf invece di %d, cercalo, ti evita di farlo da te (che funziona solo per numeri bassi.
Sbagli nel leggere il file, cosa succede se il file è più lungo di 89 caratteri, che è la lunghezza della tua stringa? Hai due soluzioni, una di allocare la strunga dinamicamente pari alla dimensione del file in byte, oppure di non leggere tutto il file bensì solo un carattere per volta, incrementando l'elemento di un vettore di 256 caratteri pari al valore del carattere (è quello che avrei fatto io), è più veloce perché usi solo un loop e allochi meno memoria.
Altro sbaglio: cosa succede se c'è un errore nell'aprire il file? Ti limiti a stampare un messaggio di errore e poi continui come niente fosse accaduto :)
Ci sono altri piccoli errori, non credere abbia finito qui :) non te la prendere troppo, parli con uno che usa il C da più di trenta anni, gli errori che hai fatto sono normali per un neofita.
 

Andretti60

Utente Èlite
3,676
2,459
Hardware Utente
Devi inoltre imparare cosa sia una "variabile di ambiente" (ti ho dato un link prima), e come inizializzarla, dopodiché come leggerla da linguaggio C (c'è una funzione molto semplice).

Come vedi sto cercando di darti suggerimenti senza darti le soluzioni, provaci un po' da solo.
 

Entra

oppure Accedi utilizzando