В дополнение к другим подсказкам, вы должны обратить внимание на строку
b = strcat(b, str_temp);
, что кажется довольно неподходящим для b, просто определяется как указатель на символ для хранения одного байта ("" определяет пустую строку, то есть массив символов с единственным элементом, содержащим '\ 0')
Таким образом, когда strcat добавляет b, он создает переполнение буфера.
Редактировать : На самом деле я только что заметил, что b был назначен для указания на a (благодаря строке, предшествующей упомянутой), так что тогда все будет в порядке, так как a может иметь место для этого. .. Однако не имеет смысла требовать две переменные.
Возможно, вы не понимаете, что хотя strcat () возвращает указатель, этот возврат не нужно «потреблять», это просто удобство, потому что когда мы объединяем команды в цепочку. Другими словами, вы можете просто написать:
strcat(a, str_temp);
Не требуется никакой символ * b.