我正在学习C,我在学习材料中遇到了这个功能。该函数接受字符串指针和字符,并计算字符串中的字符数。例如,对于字符串this is a string
和ch = 'i'
,函数将返回3
3次出现的字母i
。
我发现令人困惑的部分是在while循环中。我本来期望读取像while(buffer[j] != '\0')
这样的程序,程序将循环遍历每个元素j
,直到它读取空值。我不知道while循环在while循环中如何使用buffer
,以及如何使用buffer++
逐个字符递增程序,直到达到空值。我尝试使用调试,但由于某种原因它不起作用。提前谢谢。
int charcount(char *buffer, char ch)
{
int ccount = 0;
while(*buffer != '\0')
{
if(*buffer == ch)
ccount++;
buffer++;
}
return ccount;
}
答案 0 :(得分:0)
在循环中,您正在递增指针buffer
,直到它指向空字符,此时您知道您扫描了整个字符串。我们正在递增指针本身而不是buffer[j]
,而不是*(buffer+j)
。
当您说buffer++
时,您将buffer
中存储的地址增加一个。
一旦内部化了指针的工作方式,这段代码比使用单独索引扫描字符串的代码更清晰。
答案 1 :(得分:0)
buffer
是指向一组字符,字符串或包含字符数据的内存缓冲区的指针。
*buffer
将取消引用buffer
处的值作为字符。这可以与空字符进行比较。
当您添加到buffer
时 - 您要添加到地址,而不是它指向的值,buffer++
将1添加到地址,指向下一个字符。这意味着现在*buffer
会产生下一个字符。
答案 2 :(得分:0)
在C和C ++中,数组按顺序存储,并根据数据的第一个地址和长度存储数组。
因此* buffer实际上是第一个字节的地址,并且与buffer [0]同义。因此,您可以将buffer
用作数组,如下所示:
int charcount(char *buffer, char ch)
{
int ccount = 0;
int charno = 0;
while(buffer[charno] != '\0')
{
if(buffer[charno] == ch)
ccount++;
charno++;
}
return ccount;
}
请注意,这是,因为字符串是空终止 - 如果您在*buffer
指向的字符数组中没有空终止,它将继续读取;你失去了c知道阵列有多长的位。这就是为什么你看到这么多c函数传递指针和长度的原因 - 指针告诉它数组的[0]
位置,你指定的大小告诉它保持读取的距离。
希望这有帮助。