Puts ( s2 );
Этот фрагмент программы является «опасным» с точки зрения выхода за границы строки. В строку s1можно безопасно записать не более 49 символов (плюс завершающий ноль). Поэтому если с клавиатуры будет введена строка длиннее 49 символов, при записи ее в память произой-
дет выход за границы строки s1. Строка s2может принять не более 9 символов, поэтому при
большем размере s1произойдет выход за границы строки s2.
Поскольку реально функции передается адрес начала строки, можно заставить функцию
начать работу любого символа, а не только с начала строки. Например, следующая строка ско-
пирует строку s2в область памяти строки s1,которая начинается с ее 6-ого символа, оставив
без изменения первые пять:
strcpy ( s1+5, s2 );
При этом надо следить, чтобы не выйти за границу массива. Кроме того, если до выполнения
этой операции в строке s1меньше 5 символов, фокус не удастся.
Еще одна функция позволяет скопировать только заданное количество символов, она на-
зывается strncpyи принимает в третьем параметре количество символов, которые надо ско-
пировать. Важно помнить, что эта функция НЕ записывает завершающий нуль, а только ко-
пирует символы (в отличие от нее strcpyвсегда копирует завершающий нуль). Функция
strncpyособенно полезна тогда, когда надо по частям собрать строку из кусочков.
#include <stdio.h>
#include <string.h>
Main()
{
char s1[] = "Ку-ку", s2[10];
strncpy ( s2, s1, 2 ); // скопировать 2 символа из s1 в s2
puts ( s2 ); // ошибка! нет последнего '\0'
s2[2] = '\0'; // добавляем символ окончания строки
puts (s2); // вывод
}
Дата добавления: 2015-10-05; просмотров: 469;