Символы и строки в Си. Стандартная библиотека: ctype.h и string.h. Собственная реализация стандартных функций

Содержание

Слайд 2

Тип char char – это «очень короткий» целый тип #include void

Тип char

char – это «очень короткий» целый тип
#include
void main() {
char

ch = 32;
while (ch < 127) {
printf("%d ", ch);
ch++;
}
}
Слайд 3

Тип char (2) char – это символьный тип #include void main()

Тип char (2)

char – это символьный тип
#include
void main() {
char ch

= 32;
while (ch < 127) {
printf("%c ", ch);
ch++;
}
}
Слайд 4

Тип char (3) unsigned char = [0 .. 255] #include void

Тип char (3)

unsigned char = [0 .. 255]
#include
void main() {
unsigned

char ch = 0;
while (ch < 255) {
printf("%c ", ch);
ch++;
}
}
Слайд 5

Тип char (4) signed char = [-128 .. +127] #include void

Тип char (4)

signed char = [-128 .. +127]
#include
void main() {
signed

char ch = -128;
while (ch < 127) {
printf("%c ", ch);
ch++;
}
}
Слайд 6

Тип char (5) Загадка: Тип char == signed char ИЛИ Тип char == unsigned char ?

Тип char (5)

Загадка:
Тип char == signed char
ИЛИ
Тип char == unsigned

char
?
Слайд 7

Тип char (6) http://stackoverflow.com/questions/2054939/is-char-signed-or-unsigned-by-default The standard does not specify if plain char is signed or unsigned…

Тип char (6)

http://stackoverflow.com/questions/2054939/is-char-signed-or-unsigned-by-default
The standard does not specify if plain char is

signed or unsigned…
Слайд 8

ASCII https://ru.wikipedia.org/wiki/ASCII ASCII (англ. American standard code for information interchange) —

ASCII

https://ru.wikipedia.org/wiki/ASCII
ASCII (англ. American standard code for information interchange) — название таблицы (кодировки, набора),

в которой некоторым распространённым печатным и непечатным символам сопоставлены числовые коды. Таблица была разработана и стандартизована в США в 1963 году.
Слайд 9

ASCIIZ http://stackoverflow.com/questions/7783044/whats-the-difference-between-asciiz-vs-ascii In computing, a C string is a character sequence

ASCIIZ

http://stackoverflow.com/questions/7783044/whats-the-difference-between-asciiz-vs-ascii
In computing, a C string is a character sequence terminated

with a null character ('\0', called NUL in ASCII). It is usually stored as one-dimensional character array.[dubious – discuss] The name refers to the C programming language which uses this string representation. Alternative names are ASCIIZ (note that C strings do not imply the use of ASCII) and null-terminated string
Слайд 10

null-terminated string void main() { char s1[8] = "Hi!\n"; int i;

null-terminated string

void main() {
char s1[8] = "Hi!\n";
int i;
for (i =

0; i < 8; i++) {
printf("%c(%d), ", s1[i], s1[i]);
}
}
Слайд 11

Инициализация строки как массива символов void main() { char s1[8] =

Инициализация строки как массива символов

void main() {
char s1[8] = { 'H',

'i', '!', '\n', '\0' };
int i;
for (i = 0; i < 8; i++) {
printf("%c(%d), ", s1[i], s1[i]);
}
}
Слайд 12

Инициализация строки как строки void main() { char s2[] = "%c(%d),

Инициализация строки как строки

void main() {
char s2[] = "%c(%d), ";
int i;
for

(i = 0; i < 12; i++) {
printf("%c(%d), ", s2[i], s2[i]);
}
}
Слайд 13

Простейшие алгоритмы обработки строк (как массива символов с ‘\0’ в конце)

Простейшие алгоритмы обработки строк (как массива символов с ‘\0’ в конце)

Все

цифры заменить на символ «#»
#include
void main() {
char s3[] = "I have 32 USD and 5 EUR!";
printf("s3 = %s\n", s3);
int i = 0;
while (s3[i] != '\0') {
if (s3[i] >= '0' && s3[i] <= '9') {
s3[i] = '#';
}
i++;
}
printf("s3 = %s\n", s3);
}
Слайд 14

Используем функции из ctype.h Все цифры заменить на символ «#» #include

Используем функции из ctype.h

Все цифры заменить на символ «#»
#include
#include
void

main() {
char s3[] = "I have 32 USD and 5 EUR!";
printf("s3 = %s\n", s3);
int i = 0;
while (s3[i] != '\0') {
if (isdigit(s3[i])) {
s3[i] = '#';
}
i++;
}
printf("s3 = %s\n", s3);
}
Слайд 15

Используем функции из ctype.h Все ????? заменить на символ «#» void

Используем функции из ctype.h

Все ????? заменить на символ «#»
void main() {
char

s3[] = "I have 32 USD and 5 EUR!";
printf("s3 = %s\n", s3);
int i = 0;
while (s3[i] != '\0') {
if (isalpha(s3[i])) {
s3[i] = '#';
}
i++;
}
printf("s3 = %s\n", s3);
}
Слайд 16

Используем функции из ctype.h Все ????? заменить на символ «#» void

Используем функции из ctype.h

Все ????? заменить на символ «#»
void main() {
char

s3[] = "I have 32 USD and 5 EUR!";
printf("s3 = %s\n", s3);
int i = 0;
while (s3[i] != '\0') {
if (isspace(s3[i])) {
s3[i] = '#';
}
i++;
}
printf("s3 = %s\n", s3);
}
Слайд 17

Используем функции из ctype.h Все ????? заменить на символ «#» void

Используем функции из ctype.h

Все ????? заменить на символ «#»
void main() {
char

s3[] = "I have 32 USD and 5 EUR!";
printf("s3 = %s\n", s3);
int i = 0;
while (s3[i] != '\0') {
if (isupper(s3[i])) {
s3[i] = '#';
}
i++;
}
printf("s3 = %s\n", s3);
}
Слайд 18

Используем функции из ctype.h Все ????? заменить на символ «#» void

Используем функции из ctype.h

Все ????? заменить на символ «#»
void main() {
char

s3[] = "I have 32 USD and 5 EUR!";
printf("s3 = %s\n", s3);
int i = 0;
while (s3[i] != '\0') {
if (islower(s3[i])) {
s3[i] = '#';
}
i++;
}
printf("s3 = %s\n", s3);
}
Слайд 19

Используем функции из ctype.h Все ????? заменить на ?????? void main()

Используем функции из ctype.h

Все ????? заменить на ??????
void main() {
char s3[]

= "I have 32 USD and 5 EUR!";
printf("s3 = %s\n", s3);
int i = 0;
while (s3[i] != '\0') {
s3[i] = toupper(s3[i]);
i++;
}
printf("s3 = %s\n", s3);
}
Слайд 20

Используем функции из ctype.h Все ????? заменить на ?????? void main()

Используем функции из ctype.h

Все ????? заменить на ??????
void main() {
char s3[]

= "I have 32 USD and 5 EUR!";
printf("s3 = %s\n", s3);
int i = 0;
while (s3[i] != '\0') {
s3[i] = tolower(s3[i]);
i++;
}
printf("s3 = %s\n", s3);
}
Слайд 21

Стандартные функции обработки строк strlen(s) - Возвращает длину строки без завершающей

Стандартные функции обработки строк

strlen(s) - Возвращает длину строки без завершающей литеры

'\0'.
strcmp(s1, s2) – посимвольное сравнение строк (НЕЛЬЗЯ сравнивать строки так «s1 == s2» или
«s1 < s2»!!!)
strcpy (dest, src) – копирует сроку src в dest, включая завершающий ‘\0’
strcat (dest, src) – добавляет копию src в конец dest
И еще около 20 функций из string.h
Слайд 22

strlen() #include void main() { char s[10] = "Hi!"; printf("len =

strlen()

#include
void main() {
char s[10] = "Hi!";
printf("len = %d\n", strlen(s));
s[3] =

' '; s[4] = '\0';
printf("len = %d\n", strlen(s));
s[4] = 'W'; s[5] = 'o'; s[6] = 'r'; s[7] = 'l';
s[8] = 'd'; s[9] = '\0';
printf("len = %d\n", strlen(s));
}
Слайд 23

strlen() #include void main() { char s[10] = "Hi!"; printf("len =

strlen()

#include
void main() {
char s[10] = "Hi!";
printf("len = %d\n", strlen(s));
s[3] =

' '; s[4] = '\0';
printf("len = %d\n", strlen(s));
s[4] = 'W'; s[5] = 'o'; s[6] = 'r'; s[7] = 'l';
s[8] = 'd'; s[9] = '\0';
printf("len = %d\n", strlen(s));
}
Слайд 24

Сравнение строк – НЕ ДЕЛАЙТЕ ТАК НИКОГДА!!! void main() { char

Сравнение строк – НЕ ДЕЛАЙТЕ ТАК НИКОГДА!!!

void main() {
char s1[] =

"Button";
char s2[] = "We";
char s3[] = "Apple !!";
char * min = s1; char * max = s1;
if (s2 > max) max = s2;
if (s3 > max) max = s3;
printf("max = %s\n", max);
if (s2 < min) min = s2;
if (s3 < min) min = s3;
printf("min = %s\n", min);
}
Слайд 25

Сравнение строк через strcmp int strcmp(const char *str1, const char *str2);

Сравнение строк через strcmp

int strcmp(const char *str1, const char *str2);
int strcmp(char

str1[], char str2[]);
Функция strcmp() сравнивает в лексикографическом порядке две строки и возвращает целое значение, зависящее следующим образом от результата сравнения.
Значение Результат сравнения строк
Меньше нуля str1 меньше str2
Нуль str1 равен str2
Больше нуля str1 больше str2
Слайд 26

Сравнение строк через strcmp void main() { char s1[] = "Button";

Сравнение строк через strcmp

void main() {
char s1[] = "Button";
char s2[] =

"We";
char s3[] = "Apple !!";
char * min = s1; char * max = s1;
if (strcmp(s2, max) > 0) max = s2;
if (strcmp(s2, max) > 0) max = s3;
printf("max = %s\n", max);
if (strcmp(s2, min) < 0) min = s2;
if (strcmp(s3, min) < 0) min = s3;
printf("min = %s\n", min);
}
Слайд 27

Копирование строк void main() { char src[] = "Button"; char dest[10];

Копирование строк

void main() {
char src[] = "Button";
char dest[10];
printf("src = %s, dest

= %s\n", src, dest);
strcpy(dest, src);
printf("src = %s, dest = %s\n", src, dest);
}
Слайд 28

Конкатенация строк void main() { char src[] = "Button"; char dest[10]

Конкатенация строк

void main() {
char src[] = "Button";
char dest[10] = "<>";
printf("src =

%s, dest = %s\n", src, dest);
strcat(dest, src);
printf("src = %s, dest = %s\n", src, dest);
strcat(dest, "!");
printf("src = %s, dest = %s\n", src, dest);
}
Слайд 29

Еще раз - int strlen(char s[]) int strlen(char s[]) { int

Еще раз - int strlen(char s[])

int strlen(char s[]) {
int len;

return len;
}
Возвращает

длину строки без завершающей литеры '\0'.
Пример:
strlen(“!!”) == 2
strlen(“Hi!\n”) ==4
Слайд 30

Собственная реализация strlen int strlen_my(char s[]) { int len; … return

Собственная реализация strlen

int strlen_my(char s[]) {
int len;

return len;
}
Нужно написать код функции

strlen_my(s), работающей аналогично strlen(s)
Пример использования:
strlen_my(“!!”) == 2
strlen_my(“Hi!\n”) ==4
Слайд 31

Собственная реализация strlen int strlen_my(char s[]) { int len = 0;

Собственная реализация strlen

int strlen_my(char s[])
{
int len = 0;
while (s[len] != '\0‘)
len++;
return

len;
}