Přesný původ chyby při zadávání jednoho čísla navíc se mi zkoumat nechtělo, nic méně za to můžou ty cykly for, které projíždějí pole, které neexistuje. Přesněji přetečou mimo rozsah proměnné někam jinam do paměti ( i <= p je špatně, protože rozsah proměnné pole v paměti je 0 <=> (p-1) ). Proto je lepší nedělat nikdy tak základní chybu a potom se třeba vyvaruješ nečekaného výstupu nad kterým zůstává rozum stát.
Tady jsem ti kód trochu zkrátil, spravil a zjednodušil:
#include <stdio.h>
int i, j, p, k, a = 1;
int main()
{
printf("Kolik bys chtel zadat cisel? ");
scanf("%d",&p);
putchar('\n');
double pole[p];
for(i = 0; i < p; i++) {
printf("Zadej %d.cislo: ", i+1);
scanf("%lf", &pole[i]);
}
printf("\nVypis zadanych cisel:\n");
for(i = 0; i < p; i++) printf("%.2lf ", pole[i]);
printf("\n\nKolik kategorii chces zobrazit (0-10,10-100,100-1000,atd.) ? ");
scanf("%d", &k);
if(k <= 0 ) k = 1;
for(j = 1; j <= k; j++) {
printf("\nVypis kategorie %d - %d:\n" , ( a == 1 ? 0 : a ) ,a*10);
for(i = 0; i < p; i++) if( pole[i] >= ( a == 1 ? 0 : a ) && pole[i] <= a*10 ) printf("%.2lf ", pole[i]);
a *= 10;
putchar('\n');
}
return 0;
}