}
printf ("Введитестроку");
gets(s);
i = 0;
while (s[i]!= '\0') {
if (s[i] >= '0' && s[i] <= '9')
count ++;
}
printf("\nНашли %d цифр", count);
}
В этой программе использован тот факт, что коды цифр расположены в таблице символов последовательно от '0' до '9'. Поэтому можно использовать двойное неравенство, а не сравнивать текущий символ s[i] с каждой из цифр. Обратите внимание на разницу между символами
'\0' (символ с кодом 0, признак конца строки) и '0' (символ с кодом 48, цифра 0). Переменная
count работает как счетчик.
Копирование строк
Часто надо записать новое значение в строку или скопировать информацию из одной
строки в другую. Функции копирования принадлежат к числу «опасных» – они могут вызвать серьезную ошибку, если произойдет выход за границы массива. Это бывает в том случае, если строка, в которую копируется информация, имеет недостаточный размер (под нее выделено мало место в памяти).
В копировании участвуют две строки, они называются «источник» (строка, откуда копируется информация) и «приемник» (куда она записывается или добавляется).
При копировании строк надо проверить, чтобы для строки-приемника было выделено достаточно места в памяти
Простое копирование выполняет функция strcpy. Она принимает два аргумента: сначала
строка-приемник, потом – источник (порядок важен!).
char s1[50], s2[10];
gets(s1);
strcpy (s2, s1); // s2 (приемник) <- s1 (источник)
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];