Мы, новички, должны помогать друг другу. :)
Вот и вы.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX_STR_LEN 2048
char * moveVowels( char *s1, const char *s2 )
{
const char *vowels = "aeiou";
size_t n = strlen( s2 );
for ( char *p = s1; *s2 != '\0'; ++s2 )
{
if ( strchr( vowels, tolower( ( unsigned char )*s2 ) ) != NULL )
{
s1[n++] = *s2;
*p++ = ' ';
}
else
{
*p++ = *s2;
}
}
s1[n] = '\0';
return s1;
}
int main(void)
{
char s1[MAX_STR_LEN] =
{
"but they also had a secret, and their greatest fear"
};
char s2[MAX_STR_LEN];
puts( s1 );
puts( moveVowels( s2, s1 ) );
return 0;
}
Вывод программы:
but they also had a secret, and their greatest fear
b t th y ls h d s cr t, nd th r gr t st f rueaoaaeeaeieaeea
Примите во внимание, чтов массиве символов назначения должно быть достаточно места для размещения гласных в хвосте исходной строки.
Если вы хотите вставить символ новой строки между исходной строкой и гласными, то функция может выглядеть следующим образом.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX_STR_LEN 2048
char * moveVowels( char *s1, const char *s2 )
{
const char *vowels = "aeiou";
size_t n = strlen( s2 );
s1[n++] = '\n';
for ( char *p = s1; *s2 != '\0'; ++s2 )
{
if ( strchr( vowels, tolower( ( unsigned char )*s2 ) ) != NULL )
{
s1[n++] = *s2;
*p++ = ' ';
}
else
{
*p++ = *s2;
}
}
s1[n] = '\0';
return s1;
}
int main(void)
{
char s1[MAX_STR_LEN] =
{
"but they also had a secret, and their greatest fear"
};
char s2[MAX_STR_LEN];
puts( s1 );
puts( moveVowels( s2, s1 ) );
return 0;
}
В этом случае программа выводит
but they also had a secret, and their greatest fear
b t th y ls h d s cr t, nd th r gr t st f r
ueaoaaeeaeieaeea
Если вам не разрешено использовать стандартные строковые функции C, вы можете заменить их вызовы циклами.
Например, объявление
size_t n = strlen( s2 );
может заменить этот фрагмент кода
size_t n = 0;
while ( s2[n] ) ++n;
Так что вам нужно заменить функцию strchr
на цикл самостоятельно.