Domanda Esercizio C creazione 10000 file ed eliminazione 1000 casuali

jr_sottomajor

Utente Silver
2 Luglio 2017
96
33
4
79
Salve ragazzi, stavo svolgendo questo esercizio in c :

"1. Scrivere un programma C che crea 10.000 file nella directory corrente, generando stringhe di 12 caratteri scelti a caso (codice ASCII da 65 a 90) memorizzate in un array.
2. In ogni file vengono scritti 4 interi casuali.
3. Successivamente il programma deve leggere tutti i nomi dei file creati in un array e misurare il tempo necessario per cancellare 1.000 file selezionando nomi a caso dall'array e stampare sullo stdout il valore finale."

Partendo per step, la mia prima difficoltà in C è generare quelle stringhe di 12 caratteri casuali, avevo pensato ad una roba del tipo:
C:
#define NFILE 10000

int main(int argc, char* argv[]){
    char file[NFILE];
    for(int i = 0; i<NFILE; i++){
        file[i] = random()%25+65;
    }
    
}
Ma non credo proprio si faccia così, mi va anche in segmentation fault .
1 domanda: come si generano stringhe da 12 caratteri casuali memorizzate in un array?
Sembrerà sciocco ma una volta capito questo dovrebbe essere chiaro tutto
 
Partendo per step, la mia prima difficoltà in C è generare quelle stringhe di 12 caratteri casuali
Puoi fare una cosa di questo tipo
C:
#include <stdlib.h>

void randomize(char string[], int n) {
    for (int i = 0; i < n - 1; i++)
        string[i] = rand() % 25 + 65;
    string[n-1] = 0;
}

// ...

char filename[10000][13]; // 12 symbols + '\0'
for (int i = 0; i < 10000; i++)
    randomize(filename[i], 13);
 
  • Mi piace
Reazioni: DanyDollaro
Ultima modifica:
Sarebbe possibile evitare la funzione e fare tutto magari usando due for?
Messaggio unito automaticamente:

C:
char filename[10000][13];
for (int i=0; i<1000; i++){
    for (int j=0; j<13;j++){
        filename[i][j] = random()%25+65;
    }
}

Tipo così, evito la funzione esterna
 
Ultima modifica:
C:
    char filename[10000][13];
    for (int i = 0; i < 1000; i++) {
        for (int j = 0; j < 13; j++) {
            filename[i][j] = random() % 25 + 65;
        }
    }
Non è del tutto corretto, nell'esempio che ti ha mostrato St3ve noterai questa riga:
C:
string[n-1] = 0;
Che è stata aggiunta appositamente per evitare di sovrascrivere l'ultimo carattere della stringa, ora te ne spiego il motivo.

In C le stringhe sono un array di char terminate da un carattere nullo, che sarebbe '\0', e che ha come corrispettivo valore intero 0.
Nel tuo codice, per precisare nel ciclo for (int j = 0; j < 13; j++) si avrà che l'ultimo valore di j sarà appunto 12, andando a sovrascrivere quel carattere.
Per farti un esempio, anche perchè agli inizi potresti trovarlo un pò confusionario:
C:
int main()
{
    // Dichiari una stringa di 13 caratteri, a cui potrai
    // accedere con gli indici che vanno da 0 a 12
    char string[13];
   
    // Vogliamo che il ciclo for imposti la stringa con un semplice valore progressivo
    for (int i = 0; i < 13 - 1; i++)
        string[i] = i;
   
    // In fine, ricordati che l'ultimo carattere della stringa,
    // che in questo caso si trova all'indice 12, dovrà avere
    // come valore '\0' (ovvero 0)
    string[13 - 1] = '\0';

    // string[13 - 1] = 0; // Ha il medesimo significato
}

EDIT:
Ti lascio questo esempio
C:
#include <stdio.h>

int main()
{
    char good_str[4];
    char bad_str[4];

    for (int i = 0; i < 4 - 1; i++)
        good_str[i] = i + 'a';
    good_str[4 - 1] = '\0';

    for (int i = 0; i < 4; i++)
        bad_str[i] = i + 'a';

    printf("Good string: %s\nBad string: %s\n", good_str, bad_str);
}
 
  • Mi piace
Reazioni: St3ve