Первый фрагмент кода:
Так почему приведенный ниже код выводит num в strlen (строку), а не то, для чего он предназначен?
Выходные данные не всегда могут быть strlen(string)
и будут зависеть от входной строки string
и символа letter
, переданного в strchr()
. Например, если входное значение равно
string = "hello"
letter = 'l'
, то вы получите выходное значение 4
, которое не равно длине строки "hello"
. Если входное значение равно
string = "hello"
letter = 'o'
, то полученное значение равно 5
, что равно длине строки "hello"
. Если входное значение равно
string = "hello"
letter = 'x'
, то полученное значение равно 0
.
Выходное значение фактически зависит от позиции последнего вхождения символа letter
во входной строке.
Причина в том, что существует только один оператор, который изменяет позицию указателя string
, и этот оператор
string++;
Он работает таким образом -
Если присутствует символ в string
strchr()
будет возвращать ненулевое значение до тех пор, пока указатель ввода string
не укажет на символ на последнем вхождении символа letter
в строке или до него. Если указатель string
указывает на один символ после последнего вхождения символа letter
в строке, strchr()
вернет NULL
, и l oop завершится, а num
будет равно позиции последнего вхождения letter
символов в строке. Таким образом, вы получите вывод в диапазоне от 0
до 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"
, а в теле l oop вы выполняете
string++;
, что заставит указатель строки указывать на следующий символ символа возвращается strchr()
. Теперь string
равно
string = "lo"
letter = `l`
и strchr(string, letter)
вернет указатель на символ, на который указывает string
в данный момент, поскольку он соответствует символу letter
. Из-за string++
в теле l oop, теперь строка будет указывать на следующий символ
string = "o"
letter = `l`
, а strchr(string, letter)
вернет NULL
и l oop завершится. num
увеличивается столько раз, сколько символов letter
найдено в string
. Следовательно, второй фрагмент дает правильный вывод.