Эта строка:
a[strlen(a) + i + 1] = b[i];
пишет символы на одну позицию дальше, чем вы хотите.
При вызове в вашем примере вашей программе передаются a
и b
со следующим содержимым:
a[0] = 'e'
a[1] = 'g'
a[2] = 'g'
a[3] = 0
b[0] = 's'
b[1] = 'a'
b[2] = 'm'
b[3] = 'p'
b[4] = 'l'
b[5] = 'e'
b[6] = 0
Вы хотите получить такой результат:
a[0] = 'e'
a[1] = 'g'
a[2] = 'g'
a[3] = 's'
a[4] = 'a'
a[5] = 'm'
a[6] = 'p'
a[7] = 'l'
a[8] = 'e'
a[9] = 0
Однако, поскольку ваш код записывает в a[strlen(a) + i + 1]
, он записывает первый символ в a[strlen(a) + 0 + 1]
, то есть a[4]
. Вы хотите это в a[3]
. Вы можете изменить strlen(a) + i + 1
на strlen(a) + i
, но тогда, когда вы напишите первый символ, вы перезапишете нулевой завершающий символ, и strlen
больше не будет работать, чтобы найти длину. Чтобы это исправить, вы можете запомнить длину a
перед входом в цикл. Рассмотрим этот код:
int i = 0;
int LengthOfA = strlen(a);
for (i = 0; i < strlen(b); ++i)
{
a[LengthOfA + i] = b[i];
}
Это запишет символы в правильное место.
Тем не менее, он не ставит нулевой завершающий символ в конце a
. Для этого мы можем поставить еще один оператор после цикла:
a[LengthOfA + i] = 0;
В этот момент ваша рутина будет работать в нормальных ситуациях. Однако есть еще два улучшения, которые мы можем сделать.
Во-первых, вместо использования int
для длин и индексов мы можем использовать size_t
. В C ширина int
является гибкой, и size_t
предоставляется как хороший тип для использования при работе с размерами объектов. Чтобы использовать его, сначала используйте #include <stddef.h>
, чтобы получить его определение. Тогда ваш код может быть:
size_t i = 0;
size_t LengthOfA = strlen(a);
for (i = 0; i < strlen(b); ++i)
{
a[LengthOfA + i] = b[i];
}
a[LengthOfA + i] = 0;
Во-вторых, ваш код номинально вычисляет strlen(b)
на каждой итерации. Это расточительно. Предпочтительно рассчитать длину один раз и запомнить ее:
size_t i = 0;
size_t LengthOfA = strlen(a);
size_t LengthOfB = strlen(b);
for (i = 0; i < LengthOfB; ++i)
{
a[LengthOfA + i] = b[i];
}
a[LengthOfA + i] = 0;