Problema scanf e EOF

di il
2 risposte

Problema scanf e EOF

Salve a tutti, sono nuovo in questo forum e volevo avere chiarimenti sul seguente problema. Il mio problema riguarda la seconda scanf all'Interno del main. Ogni volta che inserisco EOF alla prima Scanf mi fa terminare direttamente il programma senza inserire il valore da eliminare. La cosa strana è che su un sistema operativo windows 10 con IDE di codeblocks funziona come dovrebbe funzionare, mentre su MacOs con IDE di Xcode appena inserisco la EOF alla prima scanf il programma termina l'esecuzione inserendo come valore da eliminare l'ultimo valore inserito all'interno della prima scanf prima dell'EOF. Ho provato ad utilizzare anche la fflush(stdin) ma niente. Attendo una risposta grazie

#include <stdio.h>
#include <stdlib.h>

void Inserisci(int*, int*, int);
void Elimina(int*, int*, int);

int main(){

    int* ArrDin, val, dim = 5, rp = 0, i;

    ArrDin = (int*) malloc(dim * sizeof(int));

    printf("Inserisci una sequenza di interi (EOF per terminare)\n");

    while(scanf("%d", &val) != EOF){
        if(dim == rp){
            dim++;
            ArrDin = (int*)realloc(ArrDin, dim*sizeof(int));
        }
        Inserisci(ArrDin, &rp, val);
    }

    printf("L'array ordinato è il seguente:\n");

    for(i = 0; i < rp; i++){
        printf("%d ", ArrDin[i]);
    }

    printf("\nInserisci valore da eliminare (EOF per terminare):\n");
    scanf("%d", &val);
    
    
    if(val != EOF){
        Elimina(ArrDin, &rp, val);
        printf("L'array con i valori eliminati:\n");
        for(i = 0; i < rp; i++){
            printf("%d ", ArrDin[i]);
        }
        printf("\n");
    }
    else
        printf("Programma terminato");
}
void Inserisci(int*a, int*rp, int val){

    int i, j;

    for (i = 0; i < *rp && val > a[i]; i++);

    if (i == *rp) // inserisci l'elemento all'inizio dell'array
        a[i] = val;
    else{//esegui lo shift a destra
        for (j = *rp-1; j >= i; j--){
            a[j + 1] = a[j];
        }
        a[i] = val;
    }
    (*rp)++;
}
void Elimina(int*a, int*rp, int elim){

    int i, j, dim = 5;
    int*nPtr;
    int k = 0, z;//variabile che conta quante volte l'elemento da eliminare è stato inserito dall'utente


    nPtr = (int*)calloc(dim, sizeof(int)); //creiamo un array dinamico all'interno del quale andremo ad inserire
                                           // tutti i valori corrispondenti agli indici che contengo l'intero da eliminare

    for (i = 0; i < *rp - 1; i++){
        if (a[i] == elim){
            j = i; // indice da inserire
            if (k == dim){
                dim = dim + 5;
                nPtr = (int*)realloc(nPtr, dim*sizeof(int));
            }
            Inserisci(nPtr, &k, j); // effettua l'inserzione solo se si verifica la condizione
                                    // del primo if del ciclo for
        }
    }


    int l, rl;
    int p = 0;
    j = 0;
    rl = *rp;

    for (l = 0; l < k; l++){
        z = nPtr[l];
        if(p > 0)
            z = z - p;
        for (i = z; i < *rp - 1; i++){
            a[i] = a[i + 1]; // esegui shift a sinistra
        }
        (*rp)--; //successivamente alle eliminazioni ridimensiona il riempimento dell'array

        p++; //poichè lo shift a sinistra è avvenuto
            // alla prossima iterazione decrementa di p l'indice corrispondente
            // all'intero da eliminare
    }

}

2 Risposte

  • Re: Problema scanf e EOF

    BelloFigo ha scritto:


    Salve a tutti, sono nuovo in questo forum e volevo avere chiarimenti sul seguente problema. Il mio problema riguarda la seconda scanf all'Interno del main. Ogni volta che inserisco EOF alla prima Scanf mi fa terminare direttamente il programma senza inserire il valore da eliminare. La cosa strana è che su un sistema operativo windows 10 con IDE di codeblocks funziona come dovrebbe funzionare, mentre su MacOs con IDE di Xcode appena inserisco la EOF alla prima scanf il programma termina l'esecuzione inserendo come valore da eliminare l'ultimo valore inserito all'interno della prima scanf prima dell'EOF. Ho provato ad utilizzare anche la fflush(stdin) ma niente. Attendo una risposta grazie
    
    #include <stdio.h>
    #include <stdlib.h>
    
    void Inserisci(int*, int*, int);
    void Elimina(int*, int*, int);
    
    int main(){
    
        int* ArrDin, val, dim = 5, rp = 0, i;
    
        ArrDin = (int*) malloc(dim * sizeof(int));
    
        printf("Inserisci una sequenza di interi (EOF per terminare)\n");
    
        while(scanf("%d", &val) != EOF){
            if(dim == rp){
                dim++;
                ArrDin = (int*)realloc(ArrDin, dim*sizeof(int));
            }
            Inserisci(ArrDin, &rp, val);
        }
    
        printf("L'array ordinato è il seguente:\n");
    
        for(i = 0; i < rp; i++){
            printf("%d ", ArrDin[i]);
        }
    
        printf("\nInserisci valore da eliminare (EOF per terminare):\n");
        scanf("%d", &val);
        
        
        if(val != EOF){
            Elimina(ArrDin, &rp, val);
            printf("L'array con i valori eliminati:\n");
            for(i = 0; i < rp; i++){
                printf("%d ", ArrDin[i]);
            }
            printf("\n");
        }
        else
            printf("Programma terminato");
    }
    void Inserisci(int*a, int*rp, int val){
    
        int i, j;
    
        for (i = 0; i < *rp && val > a[i]; i++);
    
        if (i == *rp) // inserisci l'elemento all'inizio dell'array
            a[i] = val;
        else{//esegui lo shift a destra
            for (j = *rp-1; j >= i; j--){
                a[j + 1] = a[j];
            }
            a[i] = val;
        }
        (*rp)++;
    }
    void Elimina(int*a, int*rp, int elim){
    
        int i, j, dim = 5;
        int*nPtr;
        int k = 0, z;//variabile che conta quante volte l'elemento da eliminare è stato inserito dall'utente
    
    
        nPtr = (int*)calloc(dim, sizeof(int)); //creiamo un array dinamico all'interno del quale andremo ad inserire
                                               // tutti i valori corrispondenti agli indici che contengo l'intero da eliminare
    
        for (i = 0; i < *rp - 1; i++){
            if (a[i] == elim){
                j = i; // indice da inserire
                if (k == dim){
                    dim = dim + 5;
                    nPtr = (int*)realloc(nPtr, dim*sizeof(int));
                }
                Inserisci(nPtr, &k, j); // effettua l'inserzione solo se si verifica la condizione
                                        // del primo if del ciclo for
            }
        }
    
    
        int l, rl;
        int p = 0;
        j = 0;
        rl = *rp;
    
        for (l = 0; l < k; l++){
            z = nPtr[l];
            if(p > 0)
                z = z - p;
            for (i = z; i < *rp - 1; i++){
                a[i] = a[i + 1]; // esegui shift a sinistra
            }
            (*rp)--; //successivamente alle eliminazioni ridimensiona il riempimento dell'array
    
            p++; //poichè lo shift a sinistra è avvenuto
                // alla prossima iterazione decrementa di p l'indice corrispondente
                // all'intero da eliminare
        }
    
    }
    
    Su sistemi Mac, EOF, si comporta differentemente, dicono di premere = Ctrl+D+D, forse sto dicendo una cag**ta ma cosi' ho letto su stack
  • Re: Problema scanf e EOF

    Mi sa che è una cagata però grazie lo stesso
Devi accedere o registrarti per scrivere nel forum
2 risposte