计算字符在C中的字符串中出现的次数
我是C的新手,我正在努力实现自己的explode
。 我正在尝试计算字符串中出现指定字符的次数。
int count_chars(char * string, char * chr) { int count = 0; int i; for (i = 0; i < sizeof(string); i++) { if (string[i] == chr) { count++; } } return count; }
它每次只返回0。 有人可以解释原因吗? 🙂
你的代码无可救药地存在缺陷。 这是它应该是这样的:
int count_chars(const char* string, char ch) { int count = 0; int i; // We are computing the length once at this point // because it is a relatively lengthy operation, // and we don't want to have to compute it anew // every time the i < length condition is checked. int length = strlen(string); for (i = 0; i < length; i++) { if (string[i] == ch) { count++; } } return count; }
请参阅示例输入上运行的此代码 。
这是你做错了什么:
- 由于你想要找到一个字符 ,第二个参数应该是一个字符(而不是一个
char*
),这有其含义(见#3)。 -
sizeof(string)
不会给出字符串的长度。 它给出了体系结构中指针的大小(以字节为单位),这是一个常数 (例如32位系统上的4)。 - 您正在将一些不是内存地址的值与
chr
指向的内存地址进行比较。 这是比较苹果和橙子,并将始终返回false
,因此if
将永远不会成功。 - 你要做的是将一个字符 (
string[i]
)与函数的第二个参数进行比较(这就是为什么它也是一个char
的原因)。
以上的“更好”版本
下面的评论者已经正确地识别了原始答案的部分,这些部分不是在C中执行操作的常用方法,可能导致代码速度慢,并且可能导致(在非常特殊的情况下)情况下的错误。
因为我认为count_chars
的“正确”实现可能对于正在C中进行第一步的人来说太过牵扯,所以我只是将其添加到此处并保留初始答案几乎完整。
int count_chars(const char* string, char ch) { int count = 0; for(; *string; count += (*string++ == ch)) ; return count; }
注意:我故意以这种方式编写循环,以表明在某个阶段你必须在可能的和可取的之间划清界限。
请参阅示例输入上运行的此代码 。
您可能希望使用实际获取string
长度的函数,而不是sizeof
。
sizeof
将获得数据类型的大小 。 它不会返回字符串的长度。 strlen
将返回字符串的长度。
这是C! 它的设计简洁!
int count_chars(const char* string, char ch) { int c = 0; while (*string) c += *(string++) == ch; return c; }
更新
我会尝试解释它是如何工作的:
int c = 0;
这将是已找到的匹配数的计数。
while (*string)
这是循环控制语句,只要条件为真,它将继续迭代循环。 在这种情况下,条件是*string
。 在C中,字符串存储为“空终止”,这意味着字符串的最后一个字符是值为0(’\ 0’)的字符。 *string
计算指针指向的字符。 如果C中的表达式评估为任何非零值,则表达式为“true”;如果评估为零,则表达式为“false”。 *string
是一个表达式,因此任何非零字符*string
指向的都是true,字符串末尾的’\ 0’为false。 因此,如果*string
指向*string
的结尾,这将终止。
*(string++)
这是一个表达式,它计算指针指向的值。 ++
是一个后增量,因此指针的值向前移动一个位置,即它指向字符串中的下一个字符。 请注意,由于指针已移动,因此在计算表达式之后,表达式的值与*string
的值不同。
*(string++) == ch
这是一个比较表达式,它将*string
(在更新之前)的值与ch
的值进行比较。 在C中,结果是一个整数(C中没有bool类型),如果表达式为真,则值为“1”,如果表达式为假,则值为“0”。
c += *(string++) == ch;
如果字符是我们正在寻找的字符,我们知道+=
是’1’之后的位,否则是’0’。 +=
是以下的简写:
c = c + (*(string++) == ch);
因此,如果找到匹配的字符,它将增加计数。
在这种特殊情况下, +=
语法几乎没有优势,但如果c
更复杂,比如*(variable [index].structure_member [index2])
那么它只会被评估一次。
的;
最后标志着语句的结束,因为没有{
在while
,它也标志着while
循环的结束。
每个人都告诉你答案,
1)你不能使用大小而是strlen(字符串)。他们告诉你原因
2)我认为每个人都错过了它,你使用的第二个参数是char指针。但是每个人都告诉你要把它作为chr,但是如果你还想这样做的话。
它应该在循环中
if ( string(i)== *chr ) \\ not just ch remember you declared it as a pointer ch gives the address but you want the character so use *ch
您还可以使用strchr函数。
int count_chars (char *string, char ch) { int i; if(string=strchr(string,'s'))++i; while (string!=NULL) if(string=strchr(string+1,chr) ++i; return i; }