Questa è una possibile soluzione didattica, vedi se fa quello che vuoi te...


codice:
// Reverse sentence


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




// Prints in reverse order the words of a sentence
void reverse( char *sentence, const char delimiter );



int main( int argc, char *argv[] )
{
	if( argc != 2 )
	{
		printf( "Usage: %s <sentence>\n", argv[0] );
		exit(EXIT_FAILURE);
	}
	
	
	reverse(argv[1], ' ');
	
	return 0;
}




// Prints in reverse order the words of a sentence
void reverse( char *sentence, const char delimiter )
{
	unsigned n;					// Numbers of delimiters in the sentence
	char *charPtr = NULL;
	
	
	// Calculates the number of delimiters
	charPtr = strchr(sentence, delimiter);
	for( n = 0; charPtr != NULL; ++n, charPtr = strchr(charPtr+1, delimiter) );	
	
	// More words...
	if( n )
	{
		// Allocates the word's array of pointers
		char **rWords = (char **) malloc( (n+1) * sizeof(char *) );
	
		if( rWords != NULL )
		{
			int i = 0;
		
			// The brutal pointers
			for( rWords[i] = strtok(sentence, &delimiter); i != n; rWords[i] = strtok(NULL, &delimiter) )
				++i;
	
			// Prints words in reverse order
			for( i = n; i >= 0; --i)
				printf( "%s\n", rWords[i] );
	
			// Relase rWords
			free(rWords);
		}
	}
	
	// One word
	else
		printf("%s\n", sentence);
}