计算一个字符在c编程中出现在字符串中的次数?
下面的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;
}
我得到15出现u字符串,这是错误的次数。
-
关键问题:代码需要初始化的
count
值。 @BLUEPIXY// int count; int count = 0;
-
角情况下:作为空字符是字符串中,1的结果“为次数的字符出现在字符串”所预期的任何
numTimesAppears(some_string, '\0')
。 Ado
循环修复了这一问题。一个类似的标准库函数是strchr()
,它寻找第一个匹配并考虑空字符部分可搜索字符串:“...终止空字符被认为是字符串的一部分。”与所有的角落案例一样,可以推断出各种结果 - 最好是在这种情况下记录编码目标。i = 0; do { if (mystring[i] == ch) { count++; } } while (mystring[i++]);
由于功能不修改字符串检查,使其
const
增加了功能的实用性,也许性能。 @Vlad from Moscow-
数组索引最好用
size_t
而不是int
。int
可能太窄。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; }
2是错误的。一个字符串不包含NUL字符。 NUL用于实现C字符串的事实并不意味着它包含NUL。如果有助于思考这个问题,字符串包含的字符数由'strlen()'给出,'strlen()'不包含NUL的数量。 'numTimesAppears(anyString,'\ 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
4.有点冒险。它的宽度是实现定义的(6.5.3.4),不建议转换等级大于* signed long int *(7.1.9),并且只能保证大于“65535”(7.20。3) - 尽管我见过的任何编译器都至少提供了一个范围,它覆盖了'int'的正值,而Gnu确实提供了一个范围,超过了'long int'的正值。所以这是实现定义汤的另一个美妙的地方...... –
'诠释计数;' - >'诠释计数= 0;' – BLUEPIXY
谢谢你,我刚刚编译它,它给了我正确的答案。 – user24741
使用未初始化的变量是未定义的行为 – yano