2014-04-24 32 views
2

我差不多完成了这个学期的学期,而且我正在写一个函数来查找字符串中某个字符的编号,考虑到老师分配的功能原型。我知道我必须做一些愚蠢的事情,但是这个代码要么锁定,要么无限循环地在我的函数中循环。C - 使用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 
+2

你必须使用'strchr'?我会对所有元素进行直接迭代。 – Deduplicator

+0

为此使用'strchr'是一个“矫枉过正”。只需迭代输入字符串,直到达到空字符,并在遇到输入字符时增加计数器。 –

+2

将其更改为strchr(pTemp,c)现在,您始终从原始字符串的始端开始始终 –

回答

4

你的循环总是从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++; 
} 
+0

我爱你的第二个建议,但这一章是关于功能的使用。第一个答案给出了一个分段错误并转储了核心,但迭代pString变得更近了。但是,我需要弄清楚如何在发现角色后进行更多的迭代,因为我得到了很多重复计数。感谢让我更接近。 –

+0

您是否记得在第一个块之前放置'char * pTemp = pString;'而不是'char * pTemp;'? :)我在发布前实际测试过这个块... – JohnH

+0

是的,它仍然对我发起了冲击。我甚至在所有其他方面都失败时尝试复制和粘贴代码,以防我犯了一些愚蠢的小错误。我正在Ubuntu机器上编译,如果这有所作为。 –

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 

尽管如此,较好地避免了库函数,并做了所有elelemts直接循环。

刚跳上火车车皮:

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

我很乐意这样做,但这一章是关于字符串函数的。 (叹息) –

+1

已经看到你在说,我的哀悼。 – Deduplicator

+0

更好更快的方法! – Dandymon

1

strchr()一直在寻找在同一个地方,它不会通过串进展...

试试这个修改TRA节通过使用字符串的长度的字符串,和一个简单的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; 
+2

为什么使用strlen()?通过字符串添加一个额外的迭代来获得它的长度。完全删除变量'len'而不是'i JohnH

+1

@JohnH - 使用'strlen()'只是一种方法。它的作用,你的也是。我不打算在这里打破陆地速度记录,只是回答这个问题。 :)(见编辑) – ryyker

+0

哈哈!好答案! –

1

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

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

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

相关问题