C - 使用strchr计算字符串中字符的出现次数

时间:2014-04-24 19:55:49

标签: c string count character 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

4 个答案:

答案 0 :(得分:4)

您的循环始终从pString的开头开始查看,并始终找到第一个&#39; e&#39;一遍又一遍。

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

char* pTemp = pString;

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

这会强制pTemp指向您刚刚找到的角色,然后再寻找下一个角色。

这样做会更容易:

char* pTemp = pString;
while( *pTemp )
    if( *pTemp++ == c) count++;

好的,在考虑之后,即使你已经有了这个工作,我也将内循环改为我更满意的形式:

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

答案 1 :(得分:2)

您始终从头重新开始。难怪你永远不会走到尽头。

char* pTemp; // Init here = pString
do {
    pTemp = strchr(pString, c); // pString? Really? Should be pTemp
    count++;
} while(pTemp != NULL); // pTemp != NULL is verbose for pTemp here

但是,最好避免使用库函数并对所有元素进行直接循环。

只是跳上货车列车:

size_t count(const char* s, char c) {
    size_t r = 0;
    for(; *s; s++)
        r += *s == c;
    return r;
}

答案 2 :(得分:1)

strchr()总是在同一个地方寻找,它不会在字符串中前进......

使用字符串的长度和简单的char比较,通过字符串尝试对遍历进行此修改:

int i, len = strlen(pString);
count = 0;
for(i=0;i<len;i++)
{
    if(pString[i] == c) count++; //increment count only if c found
}

return count;  

不使用strlen()(发表评论)

i=-1, count = 0;
while(pString[++i])
{
   if(pString[i] == c) count++;
}  
return count;

答案 3 :(得分:1)

strchr返回指向pString中第一次出现的字符c的指针。

因此,如果在每个循环中给出指向字符串开头的指针,pTemp将始终具有相同的值,如果字符c存在,则永远不会为NULL。这就是你有无限循环的原因。

你可能想做一些指针运算来解决你的问题;)