sizeof(char)
всегда 1. Вы можете упростить свой код, исключив его.
Как только вы узнаете размер строки, которую собираетесь прочитать, вы не сможете использовать scanf (3), чтобы ограничить вводимые данные размером буфера, который вы распределили. В общем, мы не полагаемся на входные данные для точного описания себя.
В вашем случае, даже если описание точное, код не такой: scanf обещает завершить чтение строки %s
символом NUL, поэтому для вашего 6-байтового ввода требуется 7-байтовыйбуфер для размещения этого NUL. Это одна ошибка.
Есть причудливый способ заставить scanf выделить память для вас. Традиционно, однако, вы использовали бы для этого getline (3) и strlen (3), чтобы узнать, сколько он прочитал.
Как указывает один комментарий, realloc (3) делает недействительным свой первый аргумент, что означает, что на p1
нельзя положиться после этого вызова. Вы действительно хотите, чтобы output
был отдельным буфером, в который вы будете копировать данные из p1
и p2
.
Однако после того, как вы выделите выходной буфер, вы можете быть удивлены, узнав, что sprintf (3) - ваш друг. Один вызов этой функции с конструкциями %.*s
для динамического ограничения вывода строки и арифметикой указателей на входах создаст то, что вам нужно.