СИМВОЛЬНЫЕ СТРОКИ. ОСНОВНЫЕ ФУНКЦИИ РАБОТЫ СО СТРОКАМИ СИМВОЛОВ
1.10M
Категория: ПрограммированиеПрограммирование

Лекция 6

1. СИМВОЛЬНЫЕ СТРОКИ. ОСНОВНЫЕ ФУНКЦИИ РАБОТЫ СО СТРОКАМИ СИМВОЛОВ

2.

Строки

3.

Строка — массив символов.
Работа со строками реализуется
одномерных массивов типа char.
путем
использования
Признаком окончания символьной строки является нульсимвол (\0) (нуль-терминатор). Указывать не нужно, т.к.
добавляется компилятором автоматически.
При отсутствии (\0) информация в массиве будет являться
набором символов, но не символьной строкой.
Наряду со строками в Си присутствуют строковые литералы.
(Например: “text”).
И строки и литералы — это наборы символов, расположенных
рядом в памяти компьютера. Но между массивами и
литералами есть разница, литералы нельзя изменять, а строки
— можно.

4.

Для создания строки из n символов необходимо в описании
массива указать размер n+1. По положению нуль-символа
определяется фактическая длина строки.

5.

Пример:
сhar str[]= “Stroka”;
// 6 значащих символов
сhar str[7]= {‘S', ‘t', ‘r', ‘o', 'k', ‘a', '\0' };
char *str = "Stroka";
// через указатель

6.

Функции для работы со строками

7.

Для ввода строк используются стандартные функции scanf()
или gets().
Для вывода строк используются стандартные функции printf()
или puts()

8.

scanf() – процедурная функция ввода общего назначения,
считывающей данные из потока stdin до первого символа
«пробела».
Особенности работы с функцией scanf().
1. Наличие запятой заставляет scanf() считать и отбросить
значение.
void main(){
double a, b;
scanf("%lf,%lf", &a,&b);
printf("a = %.3lf,b= %.3lf\n", a,b);
system("pause");
}

9.

Строки считываются в массивы символов, и имя массива, без
всякого указателя, является адресом первого элемента массива.
scanf("%s", address);
Элементы вводимых данных должны разделяться пробелами,
знаками табуляции или новой строки. Знаки пунктуации, такие
как запятая, точка с запятой и т.п., не считаются
разделителями.
Функция автоматически ставят в конец строки нулевой байт.

10.

gets() – считывает символы из stdin и помещает их в массив
символов, на который указывает str. Символы считываются
до тех, пока не встретится символ новой строки (ENTER).
Символ «новая строка» не делается частью строки, а
транслируется в нулевой символ, завершающий строку.
Используя gets(), можно выйти за границы массива, с
которым она вызывалась, т.к. не существует способа
указать gets(), где находится граница массива.
В качестве альтернативы можно использовать функцию
fgets(), которая позволяет указать максимальную длину.

11.

printf() – функция, применяемая для форматного вывода в
различные потоки (stdout) значений разных типов,
отформатированных согласно заданному шаблону.
Функция не переводит курсор после вывода на начало новой
строки.
puts() автоматически переводит курсор после
строковой информации в начало новой строки.
вывода
puts() занимает, меньше места и работает быстрее printf().

12.

Функции для работы со строками из string.h
int strlen(char *S)
Видит начало строки и считает количество символов (байт,
отводимых под каждый символ), этот процесс выполняется до
тех пор, пока не будет достигнут завершающий нулевой
символ.
Завершающий «нулевой символ» не входит в длину строки.

13.

. . .
void main(){
char str[10];
int s;
setlocale(LC_CTYPE, "Rus");
printf("Введите строку\n");
fflush(stdin);
gets(str);
printf("Длина строки str= %d\n", strlen(str));
system("pause");
}
strlen()

14.

char* strcpy(char *S1, char *S2)
Функция копирует строку S2, включая завершающий нулевой
символ в строку назначения, на которую ссылается
указатель S1.
Чтобы избежать переполнения, строка, на которую
указывает S1 должна быть достаточно длинной, чтобы в неё
поместилась копируемая строка (включая завершающий
нулевой символ).

15.

. . .
void main(){
char str1[10] = "Hello";
char str2[10];
char str3[15];
setlocale(LC_CTYPE, "Rus");
fflush(stdin);
strcpy(str2, str1);
strcpy(str3, "World!\n");
printf("str1: %s", str1);
printf("\nstr2: %s", str2);
printf("\nstr3: %s", str3);
system("pause");
}

16.

int strcmp(char *S1, char *S2)
Функция сравнивает символы двух строк, S1 и S2. Начиная с
первых символов функция strcmp() сравнивает поочередно
каждую пару символов, и продолжается это до тех пор, пока не
будут найдены различные символы или не будет достигнут
конец строки.
Если две строки равны – то возвращается ноль, иначе 1 или -1
(в зависимости от значения строк)

17.

. . .
void main(){
char str1[10];
char str2[10];
setlocale(LC_CTYPE, "Rus");
fflush(stdin);
printf("Введите слово: ");
scanf("%s", str1);
printf("\nВведите второе слово: ");
scanf("%s", str2);
if (strcmp(str1, str2)) printf("\nВведены разные слова!\n");
else printf("\nВведены одинаковые слова!\n");
system("pause");
}

18.

int strncpy(char *S1, char *S2, size num)
Функция копирует первые num символов из строки S2 в
строку S1.
Символ конца строки ('\0') добавляется в массив в отдельном
операторе, поскольку обращение программы к функции
strncpy не копирует нулевой символ.

19.

. . .
void main(){
char str1[10] = "Hello";
char str2[10];
setlocale(LC_CTYPE, "Rus");
fflush(stdin);
strncpy(str2, str1,3);
str2[3] = '\0';
printf("str1: %s", str1);
printf("\nstr2: %s\n", str2);
system("pause");
}

20.

char* strcat (char* s1, const char* s2);
Функция добавляет копию строки S2 в конец строки S1.
Нулевой символ конца строки S1 заменяется первым
символом строки S2, и новый нуль-символ добавляется в
конец уже новой строки, сформированной объединением двух
строк.
Функция возвращает указатель на строку S1.

21.

void main(){
char str1[20] = "Hello";
char str2[20];
setlocale(LC_CTYPE, "Rus");
fflush(stdin);
printf("Введите слово: ");
gets(str2);
strcat(str1, str2);
printf("str1: %s\n", str1);
system("pause");
}

22.

char* strncat (char* s1, const char* s2, size num);
Функция добавляет первые num символов строки S2 к концу
строки S1, плюс символ конца строки. Если строка S2 больше
чем количество копируемых символов num, то после
скопированных символов неявно добавляется символ конца
строки.
Функция возвращает указатель на строку S1.

23.

. . .
void main(){
char str1[20] = "Hello";
char str2[20];
setlocale(LC_CTYPE, "Rus");
fflush(stdin);
printf("Введите слово: ");
gets(str2);
10
strncat(str1, str2, 3);
printf("str1: %s\n", str1);
system("pause");
}

24.

char* strchr (const char* str, char c);
Функция strchr() выполняет поиск первого вхождения
символа c в строку str. Возвращает указатель на первое
вхождение символа в строке, в случае неудачи –
NULL. Завершающий нулевой символ считается частью
строки.

25.

. . .
void main(){
char str1[20], ch;
setlocale(LC_CTYPE, "Rus");
fflush(stdin);
printf("Введите слово: ");
gets(str1);
printf("Введите искомую букву: ");
scanf("%c", &ch);
printf("str1: %s\n", strchr(str1, ch));
system("pause");
}

26.

char* strrchr (const char* str, char c);
Функция strrchr() выполняет поиск последнего вхождения
символа c в строку str. Возвращает указатель на последнее
вхождение символа в строке str. Завершающий нулевой символ
считается частью строки. Таким образом, он также может
быть найден для получения указателя на конец строки.

27.

. . .
void main(){
char str1[20], ch;
setlocale(LC_CTYPE, "Rus");
fflush(stdin);
printf("Введите слово: ");
gets(str1);
printf("Введите искомую букву: ");
scanf("%c", &ch);
printf("str1: %s\n", strchr(str1, ch));
system("pause");
}

28.

char* strstr(const char *S1, const char *S2);
Функция ищет первое вхождение подстроки S2 в
строке S1. Возвращает указатель на первое вхождение
строки S2 в строку S1, или пустой указатель, если строка S2 не
является частью строки S1.
Нуль-символ не учитывается.

29.

. . .
void main(){
char str1[20], str2[20];
setlocale(LC_CTYPE, "Rus");
fflush(stdin);
printf("Введите слово: ");
gets(str1);
printf("Введите искомую комбинацию: ");
scanf("%s", str2);
printf("str1: %s\n", strstr(str1, str2));
system("pause");
}

30.

Для работы с символьными данными существуют
стандартные функции, описанные в ctype.h:
int isalpha(аргумент) – проверяет принадлежность аргумента к
множеству букв A…Z, a…z.
int isdigit(аргумент) – проверяет принадлежность аргумента к
множеству цифр 0 – 9.
int islower(аргумент) – возвращает значение истинна, если
аргумент является буквой нижнего регистра.
int isupper(аргумент) – возвращает значение истинна, если
аргумент является буквой верхнего регистра.

31.

. . .
#include <ctype.h>
void main(){
Подсчет количества букв и
цифр в строке
char str1[20];
int numb=0, let=0;
setlocale(LC_CTYPE, "Rus");
fflush(stdin);
printf("Введите строку: ");
gets(str1);
for (int i = 0; i < strlen(str1); i++){
if (isalpha(*(str1 + i)))
let++;
else if (isdigit(*(str1 + i)))
numb++;
}
printf("Количество букв в строке: %d\nКоличество цифр
в строке: %d\n", let, numb);
system("pause");
}
English     Русский Правила