这是怎么统计ff,fl,fi数量的?

#include

using std::cin; using std::cout; using std::endl;

int main()
{
unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0, spaceCnt = 0, tabCnt = 0, newLineCnt = 0, ffCnt = 0, flCnt = 0, fiCnt = 0;
char ch, prech = 0;
while (cin >> std::noskipws >> ch)
{
switch (ch)
{
case 'a':
case 'A':
++aCnt;
break;
case 'e':
case 'E':
++eCnt;
break;
case 'i':
if (prech == 'f') ++fiCnt;//这里不懂,prech怎么变化的
case 'I':
++iCnt;
break;
case 'o':
case 'O':
++oCnt;
break;
case 'u':
case 'U':
++uCnt;
break;
case ' ':
++spaceCnt;
break;
case '\t':
++tabCnt;
break;
case '\n':
++newLineCnt;
break;
case 'f':
if (prech == 'f') ++ffCnt;
break;
case 'l':
if (prech == 'f') ++flCnt;
break;
}
prech = ch;
}

 cout << "Number of vowel a(A): \t" << aCnt << '\n'
     << "Number of vowel e(E): \t" << eCnt << '\n'
     << "Number of vowel i(I): \t" << iCnt << '\n'
     << "Number of vowel o(O): \t" << oCnt << '\n'
    << "Number of vowel u(U): \t" << uCnt << '\n'
     << "Number of space: \t" << spaceCnt << '\n'
     << "Number of tab char: \t" << tabCnt << '\n'
    << "Number of new line: \t" << newLineCnt << '\n'
   << "Number of ff: \t" << ffCnt << '\n'
     << "Number of fl: \t" << flCnt << '\n'
    << "Number of fi: \t" << fiCnt << endl;

 return 0;

}
case标签下,prech怎么变化的?

这代码没有给prech赋值

#if 1
#include
using std::cin; using std::cout; using std::endl;
int main()
{
unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0, spaceCnt = 0, tabCnt = 0, newLineCnt = 0, ffCnt = 0, flCnt = 0, fiCnt = 0;
char ch, prech = 0;
while (cin >> std::noskipws >> ch)
{
switch (ch)
{
case 'a':
case 'A':
++aCnt;
break;
case 'e':
case 'E':
++eCnt;
break;
case 'i':
/*下面的一行代码主要是判断fi的数量。但是此处代码逻辑(不能够避免非法输入)有问题,若我输入一个字符再按一次回车就会出问题。
因为if里面的prech == 'f'这条判断永远不可能为真。所以fiCnt永远自加不了。*/
if (prech == 'f')
++fiCnt;//这里不懂,prech怎么变化的
case 'I':
++iCnt;
break;
case 'o':
case 'O':
++oCnt;
break;
case 'u':
case 'U':
++uCnt;
break;
case ' ':
++spaceCnt;
break;
case '\t':
++tabCnt;
break;
case '\n':
++newLineCnt;
break;
case 'f':
/*下面的一行代码主要是判断fi的数量。但是此处代码逻辑(不能够避免非法输入)有问题,若我输入一个字符再按一次回车就会出问题。
因为if里面的prech == 'f'这条判断永远不可能为真。所以fiCnt永远自加不了。*/
if (prech == 'f')
++ffCnt;
break;
case 'l':
/*下面的一行代码主要是判断fi的数量。但是此处代码逻辑(不能够避免非法输入)有问题,若我输入一个字符再按一次回车就会出问题。
因为if里面的prech == 'f'这条判断永远不可能为真。所以fiCnt永远自加不了。*/
if (prech == 'f')
++flCnt;
break;
default:
break;
}
prech = ch;

    if (ch == '~')/*还有此处如果我不加此if 判断语句的话,你的while是死循环。*/
        break;
}
cout << "Number of vowel a(A): \t" << aCnt << '\n'
    << "Number of vowel e(E): \t" << eCnt << '\n'
    << "Number of vowel i(I): \t" << iCnt << '\n'
    << "Number of vowel o(O): \t" << oCnt << '\n'
    << "Number of vowel u(U): \t" << uCnt << '\n'
    << "Number of space: \t" << spaceCnt << '\n'
    << "Number of tab char: \t" << tabCnt << '\n'
    << "Number of new line: \t" << newLineCnt << '\n'
    << "Number of ff: \t" << ffCnt << '\n'
    << "Number of fl: \t" << flCnt << '\n'
    << "Number of fi: \t" << fiCnt << endl;

return 0;

}
#endif

①:正常输入截图如下:
图片说明
②:非正常输入截图如下:
图片说明
请注意两种不同的输入方式!!!