2017-09-06 50 views
-1

下面的for循环会一直持续到字符串结束,而if分支会检查字符'u'出现在字符串“yuzuf Oztuk”中的次数,这是3次。同时,变量计数字符串中u的个数。当我编译代码时,我得到了15次你出现在字符串中的次数,这是错误的。计算一个字符在c编程中出现在字符串中的次数?

int numTimesAppears(char* mystring, char ch) 
{ 
    int i; 
    int count; 
    for(i = 0; mystring[i] != '\0' ; ++i) 
    { 
     if (mystring[i] == ch) 
     { 
      count++; 
     } 
    } 
    return count; 
} 
+7

'诠释计数;' - >'诠释计数= 0;' – BLUEPIXY

+0

谢谢你,我刚刚编译它,它给了我正确的答案。 – user24741

+2

使用未初始化的变量是未定义的行为 – yano

回答

1

我得到15出现u字符串,这是错误的次数。

  1. 关键问题:代码需要初始化的count值。 @BLUEPIXY

    // int count; 
    int count = 0; 
    
  2. 角情况下:作为空字符是字符串中,1的结果“为次数的字符出现在字符串”所预期的任何numTimesAppears(some_string, '\0')。 A do循环修复了这一问题。一个类似的标准库函数是strchr(),它寻找第一个匹配并考虑空字符部分可搜索字符串:“...终止空字符被认为是字符串的一部分。”与所有的角落案例一样,可以推断出各种结果 - 最好是在这种情况下记录编码目标。

    i = 0; 
    do { 
        if (mystring[i] == ch) { 
        count++; 
        } 
    } while (mystring[i++]); 
    
  3. 由于功能不修改字符串检查,使其const增加了功能的实用性,也许性能。 @Vlad from Moscow

  4. 数组索引最好用size_t而不是intint可能太窄。

    size_t numTimesAppears(const char* mystring, char ch) { 
        size_t count = 0; 
        size_t i = 0; 
        do { 
        if (mystring[i] == ch) { 
         count++; 
        } 
        } while (mystring[i++]); 
        return count; 
    } 
    
+1

2是错误的。一个字符串不包含NUL字符。 NUL用于实现C字符串的事实并不意味着它包含NUL。如果有助于思考这个问题,字符串包含的字符数由'strlen()'给出,'strlen()'不包含NUL的数量。 'numTimesAppears(anyString,'\ 0')'应该总是返回'0'。 –

+0

@KevinBallard有关[“字符串不包含”NUL字符“](https://stackoverflow.com/questions/46085187/counting-the-number-of-times-a-character-appears-in-a -string-in-c-programming/46085480?noredirect = 1#comment79133256_46085480),C规范将_string_定义为“一个_string_是一个连续的字符序列,并以**结尾,包括第一个空字符**。也许C规范是错误的?许多标准的lib函数显然不计数_null字符_,而其他字符显式地执行。 IAC,我认为我们同意这个功能应该记录在这个案例中。 – chux

+0

4.有点冒险。它的宽度是实现定义的(6.5.3.4),不建议转换等级大于* signed long int *(7.1.9),并且只能保证大于“65535”(7.20。3) - 尽管我见过的任何编译器都至少提供了一个范围,它覆盖了'int'的正值,而Gnu确实提供了一个范围,超过了'long int'的正值。所以这是实现定义汤的另一个美妙的地方...... –

相关问题