Слайд 1Основы программирования
ФИСТ 1 курс
Власенко
Олег
Федосович
Лекция 8
Символы и строки в
Си.
Стандартная библиотека: ctype.h и string.h.
Собственная реализация стандартных функций.
Слайд 2Тип char
char – это «очень короткий» целый тип
#include
void main()
{
char ch = 32;
while (ch < 127) {
printf("%d ", ch);
ch++;
}
}
Слайд 3Тип 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 main()
{
unsigned char ch = 0;
while (ch < 255) {
printf("%c ",
ch);
ch++;
}
}
Слайд 5Тип 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
?
Слайд 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…
Слайд 8ASCII
https://ru.wikipedia.org/wiki/ASCII
ASCII (англ. American standard code for information interchange) — название таблицы (кодировки,
набора), в которой некоторым распространённым печатным и непечатным символам сопоставлены
числовые коды. Таблица была разработана и стандартизована в США в 1963 году.
Слайд 9ASCIIZ
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
Слайд 10null-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] = {
'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), ";
int
i;
for (i = 0; i < 12; i++) {
printf("%c(%d), ",
s2[i], s2[i]);
}
}
Слайд 13Простейшие алгоритмы обработки строк
(как массива символов с ‘\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
#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 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 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 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 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() {
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() {
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) - Возвращает длину строки без завершающей
литеры '\0'.
strcmp(s1, s2) – посимвольное сравнение строк (НЕЛЬЗЯ сравнивать строки
так «s1 == s2» или
«s1 < s2»!!!)
strcpy (dest, src) – копирует сроку src в dest, включая завершающий ‘\0’
strcat (dest, src) – добавляет копию src в конец dest
И еще около 20 функций из string.h
Слайд 22strlen()
#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));
}
Слайд 23strlen()
#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 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);
int
strcmp(char str1[], char str2[]);
Функция strcmp() сравнивает в лексикографическом порядке две
строки и возвращает целое значение, зависящее следующим образом от результата сравнения.
Значение Результат сравнения строк
Меньше нуля str1 меньше str2
Нуль str1 равен str2
Больше нуля str1 больше str2
Слайд 26Сравнение строк через 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];
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] = "";
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 len;
…
return
len;
}
Возвращает длину строки без завершающей литеры '\0'.
Пример:
strlen(“!!”) == 2
strlen(“Hi!\n”) ==4
Слайд 30Собственная реализация 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;
while (s[len] !=
'\0‘)
len++;
return len;
}
Слайд 32[Домашнее] задание
Написать собственную версию strcpy_my(dest, src)
Написать собственную версию
strcat(dest, src)