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
}
}