我可以如何计算C字符串中/
出现的次数?
我可以这样做:
int countSlash(char str[])
{
int count = 0, k = 0;
while (str[k] != '\0')
{
if (str[k] == '/')
count++;
k++;
}
return count;
}
但这并不是一种优雅的方式;有什么改进建议吗?
strchr
函数可以使循环更简洁:
ptr = str;
while ((ptr = strchr(ptr '/')) != NULL)
count++, ptr++;
我应该补充说明,我不是为了简洁而简洁,并且在所有其他条件相等的情况下,我始终会选择最清晰的表达。我发现strchr
循环更加优美,但问题中的原始实现很清晰,并且存在于一个函数内部,所以我不偏向其中任何一个,只要它们都通过单元测试即可。
countSlash()
函数的主体部分。 - Jonathan Lefflerchar *ptr = strchr(str, '/'); while (ptr != NULL) ptr = strchr(ptr, '/');
?这样会两次调用strchr()
,违反了DRY(不要重复自己)原则。 - Jonathan Leffler通用接口,明显的方法,适当的类型和纯粹的惯用语:
size_t str_count_char(const char *s, int c)
{
size_t count = 0;
while (s && *s)
if (*s++ == c)
++count;
return count;
}
奥利·查尔斯沃斯可能会对在同一行上分配和条件语句提出疑虑,但我认为它被隐藏得相当好 ;-)
while (*s)
。只需要在执行的最开始检查 s
不是一个 NULL
指针就可以了。 - Greg E.NULL
只需要一次。我坚信编译器比我聪明,因此我依赖编译器来优化它。这应该很容易,因为我们在这个函数中没有修改s
。 - Philipif
语句中呢?顺便说一下,我注意到此页面上大多数解决方案都没有检查NULL
指针就直接跳转到解引用字符串,这可能会导致未定义的行为,所以你没有做同样的事情值得赞扬。 - Greg E.你的已经足够好了。也许,这样会更加美观:
int countSlash(char * str)
{
int count = 0;
for (; *str != 0; ++str)
{
if (*str == '/')
count++;
}
return count;
}
int count=0;
char *s=str;
while (*s) count += (*s++ == '/');
n += (*s++ == '/');
? - Jonathan Lefflerchar str[]
和char *str
在所有意图和目的上应该是完全可互换的。 - Greg E.char *s=str;
是有效的 C 代码。你不需要进行强制类型转换。这里使用三元运算符是多余的。(*s++ == '/')
无论如何都会返回 0
(假)或 1
(真)。你正在做类似于 (1 || 0)?1:0
的事情。 - Jack
int countChar(char const *str, char c)
相比,它具有相当专业化的接口,该函数(a)承诺不修改传递给它的字符串,并且(b)可以用于计算星号、空格等,几乎没有效率损失。如果您真的想要更少通用的接口,您可以编写一个简单的函数int countSlash(char const *str) { return countChar(str, '/'); }
。如果启用了内联等功能,编译器很有可能为您优化它。 - Jonathan Leffler