使用 strchr() 计算字符串中某个字符的出现次数

Dav*_*vey 3 c string character count strchr

我的课堂学期快结束了,我正在做一项作业,根据老师分配的函数原型,编写一个函数来查找字符串中某个字符的编号。我知道我一定在做一些愚蠢的事情,但是这段代码在我的函数中要么锁定要么无限循环。

这是一项任务,所以我不是在寻找任何人为我做作业,而只是指出我错在哪里以及为什么,这样我就可以了解如何解决它。如果您愿意提供任何帮助,我将不胜感激。

这是我写的代码:

#include <stdio.h>
#include <string.h>

int charCounter(char* pString, char c);

int main(void)
{
    char* inpString = "Thequickbrownfoxjumpedoverthelazydog.";
    int charToCount;
    int eCount;

    eCount = 0;
    charToCount = 'e';
    eCount = charCounter(inpString, charToCount);
    printf("\nThe letter %c was found %d times.", charToCount, eCount);

    return 0;
} // end main

int charCounter(char* pString, char c)
{
    int count = 0;
    char* pTemp;

    do
    {
        pTemp = strchr(pString, c);
        count++;
    }
    while(pTemp != NULL);

    return count;
} // end countCharacter
Run Code Online (Sandbox Code Playgroud)

Joh*_*hnH 5

您的循环总是从 的开头开始pString查找,并且总是一遍又一遍地找到第一个“e”。

如果您声明,char* pTemp = pString;那么您可以稍微不同地进行迭代(我之前粘贴了错误的版本,抱歉!):

char* pTemp = pString;

while(pTemp != NULL)                                                                                                    
{                                                                                                                       
    pTemp = strchr(pTemp, c);                                                                                                           
    if( pTemp ) {
        pTemp++;
        count++;
    }                                                                                                
}
Run Code Online (Sandbox Code Playgroud)

这会强制pTemp在寻找下一个角色之前指向您刚刚找到的角色。

这样做会更容易:

char* pTemp = pString;
while( *pTemp )
    if( *pTemp++ == c) count++;
Run Code Online (Sandbox Code Playgroud)

好吧,仔细想想,即使你已经有了这个工作,我还是把内循环改成了我更满意的形式:

while( (pTemp = strchr(pTemp, c)) != NULL) {                                                                                                                       
   count++;                                                                                                             
   pTemp++;
}
Run Code Online (Sandbox Code Playgroud)