Void copy1 ( char s1[],
char s2[] )
{
int i = 0;
while ( s2[i] ) {
s1[i] = s2[i];
i ++;
}
s1[i] = '\0';
}
Void copy2 ( char *s1, char *s2 )
{
while ( *s1++ = *s2++ );
}
Как видите, вторая функция получилась более компактной. Применение указателей позволило не вводить дополнительную переменную, хотя и сделала программу менее ясной. Итак, в условии цикла while стоит оператор присваивания. Если не обращать внимания на плюсы, он оз-
начает «взять символ по адресу s2 и записать его по адресу s1». Двойные плюсы ПОСЛЕ s1 и s2 означают, что ПОСЛЕ выполнения присваивания оба указателя надо увеличить на единицу,то есть перейти к следующему символу.
Что же является условием цикла? Оказывается условие – это величина *s1, то есть код символа по адресу s1. Когда же происходит проверка? Это зависит от расположения знаков ++.
В данном случае они стоят ПОСЛЕ имен переменных, поэтому операция инкремента выполняется ПОСЛЕ проверки условия. Проверка выполняе-тся так: скопировали очередной символ, посмотрели на него, и если он – ноль (признак конца строки), то вышли из цикла. После этого увеличили указатели s1 и s2. Обратите внимание, что после выхода из цикла увеличение указателей также происходит, и они будут указывать не на нули, завершающие строки, а на следующие байты в памяти.
Программа преобразования строк в цифры.
#include
#include
int main()
{
char str_i[] = “120”;
char str_l[] = “120000”;
char str_f[] = “120.50”;
int var_i = atoi(str_i);
long var_l = atol(str_l);
float var_f = atof(str_f);
return 0;
}
В результате выполнение данной программы, переменные var_i, var_l и var_f будут содержать значения 120, 120000 и 120.50 соответственно.
9. Массивы строк.
Объявление массивов строк в языке С также возможно. Для этого исполь-зуются двумерные массивы символов, что имеет следующий синтаксис:
char имя[количество][длина];
Первым размером матрицы указывается количество строк в массиве, а вторым – максимальная (с учетом завершающего нуля) длина каждой строки. Например, объявление массива из пяти строк максимальной длиной 30 значащих символов будет иметь вид:
char strs[5][31];
При объявлении массивов строк можно производить инициализацию:
char имя[количество][длина] =
{строковый литерал №1, ... строковый литерал №N};
Число строковых литералов должно быть меньше или равно количеству строк в массиве. Если число строковых литералов меньше размера массива, то все остальные элементы инициализируются пустыми строками. Длина каждого строкового литерала должна быть строго меньше значения длины строки (для записи завершающего нуля).
Например:
char days[12][10] = {
”Январь”, ”Февраль”, ”Март”, ”Апрель”, ”Май”,
”Июнь”, ”Июль”, ”Август”, ”Сентябрь”,”Октябрь”,
”Ноябрь”, ”Декабрь”
};
При объявлении массивов строк с инициализацией допускается не указывать количество строк в квадратных скобках. В таком случае, количество строк в массиве будет определено автоматически по числу инициализирующих строковых литералов.
Например, массив из семи строк:
char days[][12] = {
”Понедельник”, ”Вторник”, ”Среда”, ”Четверг”,
”Пятница”, ”Суббота”, ”Воскресенье”
};