Il modo migliore di risolvere questo problema è pensare a quello della connettività, dandoti lo spunto di provare questo procedimento:

codice:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>


#define ASCII	256



/* Torna la struttura dati con il numero di coccorrenze */
unsigned * compute();

/* Stampa le occorrenze non alfanumeriche */
void print_occorrenze( const unsigned *occorrenze );




int main()
{
	unsigned *occorrenze = compute();

	if( occorrenze != NULL )
	{
		print_occorrenze( occorrenze );
		free( occorrenze );
	}

	getchar();
	return 0;
}


/* Stampa le occorrenze non alfanumeriche */
void print_occorrenze( const unsigned *occorrenze )
{
	unsigned i;

	printf( "\n\nOccorrenze:\n" );
	for( i = 0; i != ASCII; ++i )
	{
		if( !isalnum(i) && occorrenze[i] )
			printf( "%c %u\n", (unsigned char) i, occorrenze[i] );
	}

	putchar('\n');
}



/* Torna la struttura dati con il numero di coccorrenze */
unsigned * compute()
{
	char filename[ 300 ];
	FILE *fileptr = NULL;

	printf( "Nome del file? " );
	scanf( "%300s%*c", filename );

	fileptr = fopen( filename, "rt" );

	if( fileptr != NULL )
	{
		unsigned *occorrenze = (unsigned *) calloc( ASCII, sizeof(unsigned) );

		if( occorrenze != NULL )
		{
			/* Parte principale */
			while( !feof(fileptr) )
			{
				int c = fgetc(fileptr );

				if( c != EOF ) 
					++occorrenze[ c ];
			}

			fclose( fileptr );

			return occorrenze;
		}

		fclose( fileptr );
	}

	return NULL;
}

Era quello che cercavi?