Сама функция верна, за исключением того, что она должна быть обновлена следующим образом
char * strcatt( char s1[], const char s2[] )
{
size_t i = 0, j = 0;
while ( s1[i] ) i++;
s1[i++] = ' ';
while ( s1[i] = s2[j] )
{
i++;
j++;
}
return s1;
}
Это тип int
переменных i
и j
следует изменить на тип size_t
потому что размер массива может быть больше максимального положительного значения объекта типа int
.
И второй параметр должен быть квалифицирован как const
, так как он не изменяется функцией,Иначе, по крайней мере, вы не сможете вызвать функцию для массива константных символов, переданного функции в качестве второго аргумента, даже если она не изменена в функции.
Но, тем не менее, программа имеет неопределенное поведение, поскольку символВ массиве S1
нет места для размещения строки, хранящейся во втором массиве S2
.
Программа будет действительной, если в первом массиве символов будет хотя бы 32 или более элементов
char S1[32] = "University of Colombo";
То есть, если размер массива будет равен или больше sizeof( "University of Colombo" ) + sizeof( "Sri Lanka" )
Учтите, что неопределенное поведение означает все, включая даже ожидаемый результат. :) Но это также означает, что соответствующийкод недействителен.
В случае вашей программы есть попытки записи в память вне массива символов S1
.
Произошло так, что компилятор поместил два массива сразу один за другим в порядке S1, а затем S2.Таким образом, фактически функция strcatt сама перезаписывает массив символов S2.
Но не обязательно, чтобы другой компилятор размещал массивы в этом порядке и, более того, без пробела между символьными массивами.