Good job! Just for your interest, here's how I would've done it.
(Actually, I probably would've used pointers instead of indices.)
The my_isspace function is similar to the built-in isspace function
(in header ctype.h) except it doesn't include '\v', '\r', or '\f',
which you don't seem to want (but you should check that out).
Code:
int my_isspace( char c )
{
return( c == ' ' || c == '\t' || c == '\n' );
}
int cleanSpace( char *s )
{
int i, // general loop index
first, // index of first non-whitespace character
last, // index of last non-whitespace character
found_space; // boolean: true if at least one whitespace was found
// Find the first non-whitespace character.
for( first = 0; s[first]; ++first )
if( !my_isspace( s[first] ))
break;
// Find the last non-whitespace character.
for( last = strlen(s) - 1; last > first; --last )
if( !my_isspace( s[last] ))
break;
// Move characters in string 's' between 'first' & 'last' to the
// beginning of string 's', converting one or more whitespace
// characters to a single space.
for( i = 0, found_space = 0; first <= last; ++i, ++first )
{
// While whitespace is found, skip past it.
while( my_isspace( s[first] ))
{
++first;
found_space = 1;
}
// If whitespace was found, write one space to 's'
if( found_space )
{
s[i++] = ' ';
found_space = 0;
}
// Copy next character
s[i] = s[first];
}
s[i] = '\0'; // Terminate the string
// Return the length of the modified string 's'.
return i;
}