Слайд 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;
}
Слайд 32int strcmp(char s1[], char s2[])
int strcmp(const char *str1, const char
*str2);
Функция strcmp() сравнивает в лексикографическом порядке две строки и возвращает
целое значение, зависящее следующим образом от результата сравнения.
Значение Результат сравнения строк
Меньше нуля str1 меньше str2
Нуль str1 равен str2
Больше нуля str1 больше str2
Пример использования:
strcmp(“Abba”, “Beta”) < 0
Слайд 33Собственная реализация strcmp
/*
s1 < s2 :
: 0
s1 > s2 : >0
*/
int strcmp_my(char s1[], char
s2[])
{
return …;
}
Нужно написать код функции strcmp_my(s1, s2), работающей аналогично strcmp(s1, s2)
Пример использования:
strcmp_my(“Abba”, “Beta”) < 0
Слайд 34Собственная реализация strcmp
/*
s1 < s2 :
: 0
s1 > s2 : >0
*/
int strcmp_my(char s1[], char
s2[])
{
int i = 0;
while (s1[i] != 0 && s2[i] != 0 && s1[i] == s2[i])
i++;
return s1[i] - s2[i];
}
Слайд 35Трассировка strcmp
/*
s1 < s2 :
0
s1 > s2 : >0
*/
int strcmp_my(char s1[], char s2[])
{
int
i = 0;
while (s1[i] != 0 && s2[i] != 0 && s1[i] == s2[i])
i++;
return s1[i] - s2[i];
}
Слайд 36[Домашнее] задание
Написать собственную версию strcpy_my(dest, src)
Написать собственную версию
strcat(dest, src)
Слайд 37Текстовый файл
Текстовый файл содержит последовательность символов (в основном печатных знаков,
принадлежащих тому или иному набору символов). Эти символы обычно сгруппированы
в строки (англ. lines, rows). В современных системах строки разделяются разделителями строк
https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D0%B9_%D1%84%D0%B0%D0%B9%D0%BB
Слайд 38Перевод строки
Перевод строки, или разрыв строки — продолжение печати текста с
новой строки, то есть с левого края на строку ниже,
или уже на следующей странице.
Разделителем строк, обозначающим место перевода строки, в текстовых данных служит один или пара управляющих символов, а в размеченном тексте также — определённый тег (в HTML — тег
, от англ. break — «разрыв»).
Слайд 39Перевод строки – в разных ОС
(“\n”) LF (ASCII 0x0A) используется в
Multics, UNIX, UNIX-подобных операционных системах (GNU/Linux, AIX, Xenix, Mac OS
X, FreeBSD и др.), BeOS, Amiga UNIX, RISC OS и других;
(“\r”) CR (ASCII 0x0D) используется в 8-битовых машинах Commodore, машинах TRS-80, Apple II, системах Mac OS до версии 9 и OS-9;
(“\r\n”) CR+LF (ASCII 0x0D 0x0A) используется в DEC RT-11 и большинстве других ранних не-UNIX- и не-IBM-систем, а также в CP/M, MP/M (англ.), MS-DOS, OS/2, Microsoft Windows, Symbian OS, протоколах Интернет.
Слайд 40Чтение из текстового файла - feof
Проверяет поток на достижение конца
файла.
int feof( FILE *stream );
Параметры
stream Указатель на
структуру FILE.
Возвращаемое значение
Функция feof возвращает ненулевое значение, если операция чтения попыталась читать данные после конца файла; в противном случае она возвращает 0.
https://msdn.microsoft.com/ru-ru/library/xssktc6e.aspx
Слайд 41Чтение из текстового файла - fgets
Считывание строки из потока.
char *fgets(
char *str,
int n,
FILE *stream
);
Параметры
Str - Место хранения данных.
n - Наибольшее число символов для чтения.
Stream - Указатель на структуру FILE.
Возвращаемое значение
возвращает str. Для указания ошибки или условия конца файла функция возвращает NULL.
https://msdn.microsoft.com/ru-ru/library/c37dh6kf.aspx
Слайд 42Чтение из текстового файла построчно
char filename[] = "d:\\temp\\text_in.txt";
FILE * fin;
char
s[MAX_LEN];
fin = fopen(filename, "rt");
// в цикле для всех строк
while (!feof(fin))
{
// загрузить строку
if (fgets(s, MAX_LEN - 1, fin) != NULL) {
if (s[strlen(s) - 1] == '\n')
s[strlen(s) - 1] = '\0';
convert(s);
printf("%s\n", s);
}
}
fclose(fin);
Слайд 43Задача шифрования текста
На входе текстовый файл in.txt (содержащий слова, разделители
и знаки препинания).
Необходимо сохранив все разделители и знаки препинания на
своих местах, зашифровать текст используя шифр Цезаря.
https://ru.wikipedia.org/wiki/%D0%A8%D0%B8%D1%84%D1%80_%D0%A6%D0%B5%D0%B7%D0%B0%D1%80%D1%8F
http://altaev-aa.narod.ru/security/Cesar.html
ROT13 - https://ru.wikipedia.org/wiki/ROT13
Слайд 44Шифрование одной строки
#define MAX_LEN 80
#define KEY +3
#define KEY2 -3
void convert(char
* str) {
int i;
for (i = 0; str[i] != '\0';
i++) {
str[i] = encode(str[i], KEY);
}
}
Слайд 45Шифрование одного символа
int encode(int ch, int key) {
//char smallLetters[] ="abcdefghijklmnopqrstuvwxyz";
//char
bigLetters[] ="ABCDEGGHIJKLMNOPQRSTUVWXYZ";
int newCh = ch;
if (ch >= 'A' && ch
<= 'Z') {
newCh = ch + key;
if (newCh > 'Z')
newCh = 'A' + (newCh - 'Z');
}
if (ch >= 'a' && ch <= 'z') {
newCh = ch + key;
if (newCh > 'z')
newCh = ‘a' + (newCh - 'z');
}
return newCh;
}
Слайд 47Структура многомодульного проекта
Слайд 49Main.c
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include "Caesar.h"
#define MAX_LEN 80
void main() {
…
fin =
fopen(filenameOut, "rt");
fout = fopen(filenameOut2, "wt");
// в цикле для всех строк
while
(!feof(fin))
{
// загрузить строку
if (fgets(s, MAX_LEN - 1, fin) != NULL) {
if (s[strlen(s) - 1] == '\n')
s[strlen(s) - 1] = '\0';
convert(s);
printf("%s\n", s);
}
}
Слайд 51Caesar.h
#pragma once
#define KEY +3
#define KEY2 -3
void convert(char * str);
//int encode(int
ch, int key);
Слайд 53Caesar.c
#include "Caesar.h"
int encode(int ch, int key) {
//char smallLetters[] ="abcdefghijklmnopqrstuvwxyz";
//char bigLetters[]
="ABCDEGGHIJKLMNOPQRSTUVWXYZ";
int newCh = ch;
if (ch >= 'A' && ch
'Z') {
newCh = ch + key;
if (newCh > 'Z')
newCh = 'A' + (newCh - 'Z');
}
if (ch >= 'a' && ch <= 'z') {
newCh = ch + key;
if (newCh > 'z')
newCh = 'z' + (newCh - 'z');
}
return newCh;
}
Слайд 54Caesar.c
void convert(char * str) {
int i;
for (i = 0; str[i]
!= '\0'; i++) {
str[i] = encode(str[i], KEY2);
}
}
Слайд 56Задача выделения слов
На входе текстовый файл, содержащий большой текст (книга)
на английском языке.
Нужно создать выходной текстовый файл, где есть весь
текст из входного файла, но слова, содержащие 5 и больше букв помечены звездочками с обеих сторон. (Так делаются жирными фрагменты текста в Skype)
Слайд 57Чтение посимвольно - getc
Считывает символ из потока.
int getc( FILE
*stream );
Параметры
stream Входной поток.
Возвращаемое значение
Возвращает считанный
символ. Чтобы указать на ошибку чтения или конец файла, getc возвращает EOF
Слайд 58Код программы
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
void main() {
printf("Start\n");
FILE *fin =
fopen("D:\\temp\\Files\\Lec12\\alice.txt", "rt");
FILE *fout = fopen("D:\\temp\\Files\\Lec12\\alice1_out.txt", "wt");
int is_letter = 0;
char word[81];
// если слово будет длиннее 80 символов – всё сломается!
int word_len = 0;
int ch;
Слайд 59Код программы (2)
while ((ch = getc(fin)) != EOF)
{
if (isalpha((unsigned char)ch))
{
if (!is_letter) {
word_len = 0;
is_letter = 1;
}
word[word_len++] = ch;
}
//else {
// if (!isalpha(ch)) {
Слайд 60Код программы (3)
else { // if (!isalpha(ch)) {
if (is_letter) {
word[word_len]
= '\0';
if (word_len >= 5)
fprintf(fout, "*%s*", word);
else
fprintf(fout, "%s", word);
}
is_letter =
0;
fprintf(fout, "%c", ch);
} // else
} // while ((ch = getc(fin)) != EOF)
Слайд 61Код программы (4)
fclose(fin);
fclose(fout);
printf("Done!\n");
{
int x;
scanf("%d", &x);
}
}
Слайд 65Задача 1 - создать файл в русской кодировке
#include
#include
void
main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char ss[3][80] = {"задача 2",
"Преобразовать файл in2.txt в файл
out2.txt",
"Заменив все большие русские буквы на маленькие“};
FILE * fout = fopen("D:\\temp\\Files\\Lab11_12\\in1.txt", "wt");
// в цикле для всех строк
for (int i = 0; i < 3; i++) {
// сохранить строку в выходной файл
fprintf(fout, "%s\n", ss[i]);
printf(">>%s<<\n", ss[i]);
}
fclose(fout);
}
Слайд 66Источники информации
Работа с русским языком - https://nicknixer.ru/programmirovanie/russkie-simvolybukvy-pri-vvodevyvode-v-konsol-na-c/
Msdn
Википедия