Задать вопрос
@amaterasu0

Почему добавляется лишний символ в массив?

Добавляется лишняя 'v' в массив name. Почему так происходит?

600825ee140d7581619692.png

#include <stdio.h>


// strct(s, t) Copy string t in end of string s;
void strct(char *s, char *t);


int main(void) {

	char name[] = "Ivan ";
	char surname[] = "Golubkov";

	printf("Before: %s\n", name);
	strct(name, surname);
	printf("After: %s\n", name);


	return 0;
}


void strct(char *s, char *t) {

	for (; *s != '\0'; s++)
		;

	if (*s == '\0') {
		for (; *t != '\0'; t++)
			*s++ = *t;
	}
}
  • Вопрос задан
  • 161 просмотр
Подписаться 1 Простой 3 комментария
Решения вопроса 3
15432
@15432
Системный программист ^_^
после
for (; *t != '\0'; t++)
      *s++ = *t;

добавьте
*s = '\0'

чтобы строчку завершить

но вообще у вас переполнение буфера идёт, за рамки массива вылезаете при копировании. Обратите на это внимание и выделяйте память динамически.
Ответ написан
Комментировать
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Вы не копируете '\0' на конце. Поэтому после приписывания идет мусор. И так получается, что у вас в памяти там мусор "v\0".

Вторая проблема, вы пишите в строку s, не меняя ее размер.
char s[] = "abc"; выделяет ровно столько памяти, сколько нужно для "abc", да еще и на стеке, раз у вас переменные локальные.

Вы при дописывании чего-то к строке затираете другие переменные. Так у вас совпало, что после name идет surname на стеке. Поэтому вы переписываете память второй строки (но без первого символа, который занял место '\0' в name. Именно поэтому мусор в конце - это неперезаписанный конец surname "v\0". Если поменять местами переменные, то вы может стек перепишите и у вас программа вообще упадет.

Вам надо строки выделять с запасом: char name[1000] = "Ivan";
Ответ написан
Комментировать
У вас память накладывается.
Условно до вызова функции память выглядит так:
Ivan \0Golubkov\0
А после:
Ivan Golubkovv\0
Посмотрите, что творится с переменной surname и убедитесь

Чтобы это исправить надо либо для name выделять заранее память побольше, либо при склеивании выделять новую память и возвращать на неё указатель.

PS: Если не играться в "кто меньше строк напишет", то вот так будет гораздо понятнее:
void append_str(char* first, char* second) {
  char* end_of_first = first;
  while(*end_of_first != '\0') {
    end_of_first++;
  }
  char* current = second;
  while(*current != '\0') {
    *end_of_first = *current;
    end_of_first++;
    current++;
  }
  *end_of_first = '\0'; // Самое важное
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы