Условие
if (*p != 'a' || *p != 'e' || *p != 'i' || *p != 'o' || *p != 'u')
неверно. Например, когда *p
равно 'e'
, то есть когда * p является гласным, выражение *p != 'a'
дает значение true, и это результат полного условия.
Вы должны написать оператор ifкак
if (*p != 'a' && *p != 'e' && *p != 'i' && *p != 'o' && *p != 'u')
или как
if ( ! ( *p == 'a' || *p == 'e' || *p = 'i' || *p != 'o' || *p != 'u') )
Кроме того, следуя соглашению для стандартных строковых функций C, функция должна возвращать указатель на строку результата. И первый параметр должен иметь квалификатор const, поскольку указанная строка не изменяется в функции.
Вместо использования длинного выражения в условии if можно использовать стандартную функцию C strchr
, чтобы проверить, является лиУказанный символ является гласным или нет.
Вот демонстрационная программа, которая показывает, как можно определить функцию.
#include <stdio.h>
#include <string.h>
char * filter( const char *p, char *q )
{
const char *vowels = "aeiou";
char *result = q;
do
{
if ( *p == '\0' || strchr( vowels, *p ) == NULL ) *q++ = *p;
} while ( *p++ );
return result;
}
int main(void)
{
char *str1 = "hello";
char str2[10];
puts( filter( str1, str2 ) );
return 0;
}
Ее вывод
hll
ИВы можете изменить функцию так, чтобы она пропускала гласные в верхнем регистре.
Например
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char * filter( const char *p, char *q )
{
const char *vowels = "aeiou";
char *result = q;
do
{
if ( *p == '\0' || strchr( vowels, tolower( ( unsigned char )*p ) ) == NULL )
{
*q++ = *p;
}
} while ( *p++ );
return result;
}
int main(void)
{
char *str1 = "HELLO";
char str2[10];
puts( filter( str1, str2 ) );
return 0;
}
Вывод программы:
HLL