
- •Конспект лекций по предмету
- •Раздел 1. Основы языка.
- •Тема 1. История создания языка Си. Достоинства языка. Использование языка Си.
- •Тема 2.
- •Структура простой программы.
- •Описание переменных.
- •3.Использование комментариев. Читаемость.
- •Зарезервированные слова.
- •Раздел.2 Элементы языка. Выражения.
- •Тема 3.
- •3. Выражения
- •Раздел 3. Операторы языка. Условный оператор if
- •Оператор switch
- •Операторы цикла
- •Цикл с параметром (for)
- •Операторы передачи управления
- •Оператор goto
- •Оператор break
- •Оператор continue
- •Оператор return
- •Раздел 4. Указатели и массивы Указатели
- •Инициализация указателей
- •Присваивание указателю адреса существующего объекта:
- •Присваивание указателю адреса области памяти в явном виде:
- •Присваивание пустого значения:
- •Выделение участка динамической памяти и присваивание её адреса указателю:
- •Внимание!
- •Объявляется массив из 10 указателей на функции без параметров, возвращающих указатели на int.
- •Раздел 5. Строки. Работа со строковыми данными
- •Функции работы со строками и символами
- •Символьные строки и строковые функции
- •Ввод-вывод строк средствами с.
- •1) Scanf, printf – вводит/выводит одно слово:
- •2) Ввести предложение:
- •3) Специальные средства ввода – вывода строк – gets и puts
- •Различия между массивом символов и указателем на строку
- •Массивы строк
- •Функции с для обработки строк
- •Strcat(), strncat(). Соеденение строк.
- •Другие функции для строк(краткое описание)
- •Раздел 6. Структуры. Структуры (struct)
- •Раздел 7. Функции (подпрограммы). Функции
- •Объявление и определение функций
- •Глобальные переменные
- •Возвращаемое значение
- •Параметры функции
- •Передача массивов в качестве параметров
- •Раздел 8. Файлы(потоки) Функции ввода/вывода
- •Открытие потока
- •Ввод/вывод в поток
- •Закрытие потока
- •Обработка ошибок
Strcat(), strncat(). Соеденение строк.
char *strcat(char *s1, char *s2);
добавляет s2 к s1 и возвращает s1. В конец результирующей строки добавляется \0.
char *strcat(char *s1, char *s2, size_t n);
добавляет не более n символов из строки s2 к s1, если s2 короче s1, то вся строка добавляется, в конец результирующей строки добавляется \0. Тип size_t означает любой целый, например, int, long int и т.д.
Программа объеденяет строки, сначала проверяя их размер. Применяются обе функции
#include <string.h>
#define n_c 40 // поименованная константа
#define n_g 13
int main(void)
{
char cwetok[n_c]; // цветок, длина – 40 (с '\0')
char add_str[]=” имеет жуткий запах.”; // 20 символов
char guk[n_g]; //жук, длина 13 (без \0 - 12)
int len;
puts(“Ваш любимый цветок?”);
gets(cwetok);
if ((strlen(add_str)+strlen(cwetok)+1)<=n_c)
// если длина добавляемой строки и длина введеного цветка вместе не превышают
// 40 (c учетом прописываемого в конце «нуля»), то соеденить эти строки
strcat(cwetok,add_str);
puts(“Ваш любимый жук?”);
gets(guk);
len=n_g-strlen(guk)-1; // такое максимальное кол-во символов мы можем добавить
//к строке guk
strncat(guk,add_str,len);
puts(guk);
puts(cwetok);
return 0;
}
Если на запрос «Ваш любимый цветок?» введём «орхидея» (7 символов) то после добавления add_str будет выведено:
Орхидея имеет
жуткий запах.
(7+19+1=27. Это <=40)
Если на запрос «ваш любимый жук?» введём «Жук навозник» (12 символов), то после обьеденения строк будет выведено:
Жук навозник.
Если при этом переопределить #define n_g 21, то после обьеденения будет выведено:
Жук навозник имеет
ж
(всего 20 символов,
21 это ‘\0’)
имеет ж
2-а. sprintf(). Соеденение строк.
sprintf() – соеденение строк, работает так же как и printf, только выводит не на экран, а прописывает в массив символов в определенном формате несколько значений, тем самым объединяя их, имя этого массива- это 1-й параметр sprintf().
Пример. Объединим в одну строку 2 введенные строки – фамилию и имя и одно введенное число.
#include <stdio.h>
#define max 20
int main()
{ char name[max]; Будет выведено:
c
Введите имя: Макс Введите
фамилию: Иванов Введите
сумму: 20000 Иванов
Макс: $20000.0
char res[2*max+10];
float sum;
puts(“Введите имя: ”);
gets(name);
puts(“Введите фамилию: ”);
gets(fam);
puts(“Введите сумму: ”);
scanf(“%f”,&sum);
sprintf(res,”%s,%-19s:$%6.2f”,fam,name,sum);
puts(res);
return 0;
}
3. strcmp(), strncmp() – сравнивание строк (посимвольное, до 1-го несовпадаю-щего).
int strcmp(char s1,char *s2) – сравниванивает строки s2 и s1, пока не найдет отличающийся символ и возвращает : отрицательное, если s1<s2,
положительное, если s1>s2,
возвращает 0, если s1=s2.
int strncmp(char *s,char *s2, size_t n); в отличии от strcmp() сравнивает не до тех пор, пока не найдет отличающийся символ, а до тех пор, пока они будут отличатся, или пока не сравнится n символов.
Обе функции возвращают разность между значениями кодов ASCII.
В таблице кодов ASCII сначала большие латинские буквы, потом малые.
Пример. Strcmp()
#include <stdio.h>
#include <string.h>
int main() // будет выведено:
{ printf(“%d\n”,strcmp(“A”,”A”)); // 0
printf(“%d\n”,strcmp(“A”,”B”)); //-1
printf(“%d\n”,strcmp(“C”,”A”)); //2
printf(“%d\n”,strcmp(“Z”,”a”)); //-7 (т.к больше буквы реньше малых в
// ASCII)
printf(“%d\n”,strcmp(“муля”,”мул”)); //115 (т.к «я» сравнивается с '\0')
return 0;
}
Сравниваются не символы а строки, т.е. не 'A' и ‘A’, а строка“A” и строка“A“.
Пример. strncmp(). Например найти строки начинающиеся с «астро». Сколько их?
#include <stdio.h>
#include <string.h>
#define d 4
int main()
{ char *slov[d]={“астрономия”,”опытный”,”астрофизика”,”звезда”}; //это масив
// строк
int i, kol = 0; // кол-во строк начинающихся с «астро»
for (i=0; i<=d-1; i++)
if ( strncmp ( slov [ i ], ”астро” , 5 ) = = 0 )
{ printf ( “ \ n % s ” , slov [ i ] ) ; Будет напечатано:
kol + + ; астрономия
} астрофизика
printf(“\nКол-во совпадений= %d.”,kol); кол-во совпадений = 2.
return 0;
}
4. strcpy() и strncpy()- копирование строк.
char *strcpy(char *s1,char *s2); копирует s2 в s1 и возвращает s1, '\0' тоже копируется.
char *strncpy(char *s1, char s2, size_t n); копирует не более n символов из s2 в s1 и возвращает s1. Если '\0' в строке встретился раньше, то копирование прекращается, а оставшиеся до n символы заполняются \0'. Если n< или = длине строки s2, то \0' в s1 не записывается.
strcpy() и Strncpy() (так же как и функции сравнения- не проверяют: достаточно ли места в строке s1 для s2. Если нет, то поведение программы не определено).
Пример strcpy(). С клавиатуры вводить слова, пока не будет введено 5 слов начинающихся с 'д'. Сохранить их в массив слов.
#include <stdio.h>
#include <string.h>
# define max 10 // максимальная длина вводимого слова.
#define k 5 // кол-во слов, начинающихся с «д»
int main()
{ int i=0;
char m_slov[k][max]; // массив слов, начинающихся с «д»
char slovo[max]; // вводимое клавиатуры слово
while ((i<k)&&(gets(slovo)) // если i<5 и нет ошибок при вводе слова то
{ if (slovo[0]!=’д’) printf(“\n ! %s не начинается с «д»!”,slovo);
else {strcpy(m_slov[i],slovo); // (использование strncpy() смотри ниже)
}
}
for (i=0;i<k,;i++) // вывод слов начинающихся с «д»
puts(m_slov[i]);
return 0;
}
Будет на экране:
при вводе: при выводе:
дом дым дрова сало !
сало не начинается с «д» дыра дерево
дом дым дрова дыра дерево
Использование strncpy() для этой задачи:
{strncpy(m_slov[i], slovo, max-1); // копирование не более 9 символов
m_slov[max-1]=’\0’; // это нужно делать т.к. если слово длинее, чем
} // max-1 то \0 не будет скопирован
Схема strcpy() (она использует указатели)