第一个代码片段:
那么为什么下面的代码输出 num 到 strlen(string) 而不是它的设计目的呢?
输出可能并不strlen(string)
总是,将取决于输入字符串string
和letter
传递给的字符strchr()
。例如,如果输入是
string = "hello"
letter = 'l'
那么你将得到的输出4
不等于 string 的长度"hello"
。如果输入是
string = "hello"
letter = 'o'
那么你将得到的输出5
等于 string 的长度"hello"
。如果输入是
string = "hello"
letter = 'x'
那么你将得到的输出是0
.
输出实际上取决于letter
输入字符串中字符最后一次出现的位置。
原因是只有一个语句正在修改string
指针的位置,并且该语句是
string++;
它以这种方式工作 -
如果字符存在于 中string
,strchr()
则将返回一个非空值,直到输入string
指针指向字符串中最后一次出现字符时或之前的字符letter
。一旦string
指针指向字符串中最后一次出现的字符之后的一个letter
字符,strchr()
就会返回NULL
并退出循环,并且num
将等于字符串中最后一次出现的letter
字符的位置。0
因此,您将获得从to范围内的输出,但strlen(string)
并非strlen(string)
总是如此。
string = "hello", letter = 'e', num = 0
strchr(string, letter) will return not null as 'e' present in input string
num++; string++;
string = "ello", letter = 'e', num = 1
strchr(string, letter) will return not null as 'e' present in input string
num++; string++;
string = "llo", letter = 'e', num = 2
strchr(string, letter) will return null as it does not find 'e' in input string and loop exits
Output will be 2
第二个代码片段:
但是这段代码给出了正确的输出
是的,原因是strchr()
返回的指针被分配给string
指针。以与上面相同的示例为例,假设输入为
string = "hello"
letter = 'l'
strchr(string, letter)
将指针返回到第一次出现的字符l
,并将其分配给指针string
。所以,现在字符串指针指向第一次出现的l
. 这意味着,现在string
是
string = "llo"
在循环体中你正在做
string++;
这将使字符串指针指向由 . 返回的字符的下一个字符strchr()
。现在string
是
string = "lo"
letter = `l`
并将strchr(string, letter)
返回string
指向当前指向的字符的指针,因为它与字符匹配letter
。由于string++
在循环体中,现在字符串将指向下一个字符
string = "o"
letter = `l`
并将strchr(string, letter)
返回NULL
并且循环将退出。num
增加的次数与在 中letter
找到的字符一样多string
。因此,第二个片段给出了正确的输出。