Puts ( s1 );
}
При первом вызове strcpyмы хотели скопировать конец строки, начиная с символа с номером 5 (он шестой с начала, так как нумерация идет с нуля) вправо на nсимволов (объявленная__длина массива символов – 80 – позволяет это сделать). Однако из-за того, что копирование выполнялось с начала блока данных, скопировав на новое место первый символ фамилии ('Р') функция стерла букву 'н'(справа на 9 символов) и т.д. В результате получили
s1 = "Иван РождествеРождествеРождес"
В следующей строчке мы скопировали в середину отчество (без завершающего нуля) и получили
s1 = "Иван Петрович РождествеРождес"
Таким образом, вся задумка не удалась из-за того, что функция копирования работает в данном случае неверно. Выход из этой ситуации такой – написать свою функцию копирования, которая копирует не с начала блока, а с конца (однако она будет неверно работать в обратной ситуации– при сжатии строки). Например, так:
void strcpy1 ( char s1[], char s2[] )
{
int n = strlen(s2);
while ( n >= 0 )
{
s1[n] = s2[n];
N --;
}
}
Заметьте, что завершающий нуль строки s2также копируется. Если использовать в нашем
примере эту функцию вместо strcpy, то получим желаемый результат.
Возникает вопрос: можно ли сделать функцию, которая всегда правильно копирует? Конечно, можно, хотя это и не просто. Для этого в самой функции надо использовать вспомогательную строку (ее называют буфером) и в ней формировать результат так, чтобы в процессе копирования не портилась исходная строка. Когда результат в буфере готов, его останется скопировать в то место, где была исходная строка и удалить память, выделенную под буфер. Попробуйте написать такую функцию, если известно, что ее будут использовать для копирования строк длиной не более 80 символов.
Дата добавления: 2015-10-05; просмотров: 431;