Ваша программа имеет неопределенное поведение с показанным вводом уже в строке
cin >> S;
Массив S
имеет длину 10
, а ввод состоит из 10 символов, но перегрузка char*
>>
требуется дополнительный символ для хранения нулевого терминатора строки. Это означает, что массив должен иметь как минимум размер 11
. В противном случае ваша программа получает доступ к массиву вне пределов и вызывает неопределенное поведение, что означает, что программа может или не может обработать sh или сделать что-либо еще.
Вы не должны использовать char
массивы для хранения строк в C ++. Вы должны использовать std::string
вместо этого. В C вы не должны использовать cin >>
(потому что у него его нет), и вы должны изучать / преподавать только либо C, либо C ++, но не оба смешанные. Вы не будете использовать strcpy
и strstr
в C ++. Стиль, который считается хорошим в двух языках, совершенно различен.
Перегрузка char*
>>
будет даже удалена из языка в C ++ 20. Вместо этого произойдет перегрузка, принимающая массивную ссылку char[N]
, которая затем прекратит чтение после символов N-1
, чтобы избежать переполнения буфера, подобного этому. В нашем случае, используя S
напрямую, который является массивом, ваша программа пропустит чтение последнего символа, потому что это будет go за пределами массива, в C ++ 20, но по крайней мере это прямой источник неопределенного поведения больше не будет.
Дополнительно strcpy
имеет неопределенное поведение, если источник и пункт назначения перекрываются. Вместо этого используйте std::copy
в C ++ или memmove
в C.