Dunque ho risistemato un po' il codice, tra quello che avevo e quello che c0der mi ha aiutato a scrivere, ed alla fine ho elaborato questo:
codice:
#include <iostream>
#include <stdlib.h>
using namespace std;

void chiedi_primo()
{
    long long p;
    char c;
    float f; 
	int divisori = 0;   
    
    cout << "Digita un numero intero positivo: \n\n", cin >> p;
    if (p == c || p == f || p == 0)
        cout << " Cos'e' questo ciarpame!?\n\n", exit(0);
    else if (p < 0)
        cout << " Non fare il furbetto, voglio un numero positivo!\n\n";
    else if (p < 2)
        cout << " Questo non e' un numero primo.\n\n";
    else if (p == 2)
        cout << p << " Questo e' il numero primo piu' piccolo e piu' bello!\n\n";
    else {
		for (int q = 2; q <= p/2; q++)
            if (p%q == 0) {
                cout << p << " = " << q << " * " << p / q << endl;
                divisori++;
            }
        if (divisori > 0)
            cout <<"\nQuesto dimostra che "<< p <<" non e un numero primo.\n\n";            
        else
            cout <<"\n"<< p <<" e' un numero primo!\n\n";
    }
}
int main()
{
    while (true)
       chiedi_primo();

    return 0;
}
Va tutto benissimo, ossia il programma restituisce tutti i divisori qualora il numero inserito non sia primo, et vicem.
Se inserisco "la vispa teresa" o "asd" o "i" o "0.00034" il programma rifugge dallo schifo inserito, uscendo.

Ma se inserisco "11d", il programma mischia le cose: stdout mi dice:

"11d è un numero primo.

Cos'è questo ciarpame?"

Ossia mischia i risultati dell'inserimento di "11" con "d"..
Non so come risolverlo..

Aiutatemi per favore!

P.s. domanda: l'inserimento di exit(0) è corretto? O ci sono altri modi per effettuare quell'azione?

grazie!!