3

我几乎完成了学期的课程,我正在写一个函数来查找字符串中某个字符的编号,给定老师分配的函数原型。我知道我一定是在做一些愚蠢的事情,但是这段代码要么被锁定,要么在我的函数中无限循环。

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

这是我写的代码:

#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

4 回答 4

5

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

如果您声明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++;
}
于 2014-04-24T19:59:38.320 回答
3

你总是从头开始。难怪你永远不会结束。

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;
}

如果您坚持使用strchr()

size_t count(const char* s, char c) {
    size_t r = 0;
    while ((s = strchr(s, c)))
        ++r;
    return r;
}
于 2014-04-24T19:59:28.903 回答
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;
于 2014-04-24T20:01:36.723 回答
1

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

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

您可能想在这里做一些指针算术来解决您的问题;)

于 2014-04-24T20:03:26.873 回答