Я изучаю C и пытаюсь реализовать функцию
char *es_cat(char *dst, char *src)
, которая добавляет строку src
в конец dst
, но с небольшим поворотом:Считается, что строки заканчиваются символом '?'
вместо обычного '\0'
.Созданная строка должна заканчиваться '?'
, но первая строка '?'
игнорируется.Вот моя попытка:
/* A simple function to determine the length of a string according to the
* previously stated '?' constraint.
*/
unsigned int es_length(const char *s)
{
const char *c = s;
int amount = 0;
while (*c != '?')
{
amount++;
c++;
}
return amount;
}
char *es_cat(char *dst, char *src)
{
int total = es_length(dst) + es_length(src) + 1; // + 1 for the last '?'
char buffer[total];
char *b = buffer;
/* Copy the dst string. */
while (*dst != '?')
{
*b = *dst;
dst++;
b++;
}
/* Concatenate the src string to dst. */
while (*(src-1) != '?')
{
*b = *src;
src++;
b++;
}
printf("\n%s", buffer);
return buffer;
}
int main(void)
{
char cat_dst[] = "Hello ?"; // length according to es_length = 6
char cat_src[] = "there! - Well hel?"; // length according to es_length = 17
es_cat(cat_dst, cat_src);
return 0;
}
Теперь, когда я бегу, я ожидаю вывод: Hello there! - Well hel?
.Строка в основном такая же, но за ней следуют 3 символа мусора (если быть точным, вывод теперь Hello there! - Well hel?■@
).Когда я добавляю или удаляю 3 символа из массива cat_src char, мусорные символы исчезают.Я неправильно инициализирую буфер или я что-то путаю с указателями?
С другой стороны, возможно ли объединить строку dst
напрямую, т.е. не создавать буфер?
Заранее спасибо!