Это подвыражение, используемое в операторе if
strchr("aeiouAEIOU", pch2[0] == NULL) && strchr("aeiouAEIOU", pch2[strlen(pch2)-1] == NULL)
неверно.
Должно быть
strchr("aeiouAEIOU", pch2[0] ) == NULL && strchr("aeiouAEIOU", pch2[strlen(pch2)-1] ) == NULL
Вы можете написать оператор if намного проще следующим образом
if ( ( strchr( "aeiouAEIOU", pch2[0] ) == NULL ) ==
( strchr( "aeiouAEIOU", pch2[strlen(pch2)-1] ) == NULL ) )
Но в любом случае создание копии исходной строки и использование strtok
не очень хороший подход.
Лучше использовать стандартную C функцию strspn
и strcspn
для извлечения слов в строке без ее изменения.
Вы можете хранить слова, которые удовлетворяют условию, в векторе.
Вот демонстрационная программа.
#include <iostream>
#include <utility>
#include <vector>
#include <cstring>
#include <cctype>
int main()
{
const char *s = "La bacalaureat la proba de Informatica "
"a fost un subiect cu un sir de caractere";
const char *vowels = "aeiou";
const char *delim = " \t";
std::vector<std::pair<const char *, const char *>> v;
size_t n = 0;
for ( const char *p = s; *p != '\0'; )
{
p += std::strspn( p, delim );
const char *q = p;
if ( *q )
{
++n;
p += std::strcspn( p, delim );
char c1 = std::tolower( ( unsigned char )q[0] );
char c2 = std::tolower( ( unsigned char )p[-1] );
if ( ( std::strchr( vowels, c1 ) == nullptr ) ==
( std::strchr( vowels, c2 ) == NULL ) )
v.emplace_back( q, p );
}
}
std::cout << n << '\n';
for ( const auto &p : v ) std::cout.write( p.first, p.second - p.first ) << ' ';
std::cout << '\n';
return 0;
}
Его выход
15
bacalaureat Informatica a fost subiect sir