第一个代码片段:
那么为什么下面的代码输出 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。因此,第二个片段给出了正确的输出。