ПОЯСНЕНИЯ К ФУНКЦИЯМ ЗАГОЛОВОЧНОГО ФАЙЛА string.h
// СОКРАЩЕНИЯ: возв-т - возвращает, Ук -указатель.
// ОБОЗНАЧЕНИЯ: s, s1, s2 - Ук-ли на строки, ch - символ, n - кол-во символов
typedef unsigned size_t; // 0..65535
void *memchr(const void *blok, int ch, size_t n); // возв-т Ук на первое
// вхождение ch в первые n байтов блока памяти с Ук blok, иначе NULL
int memcmp(const void *bl1, const void *bl2, size_t n); // сравнение первых n
// байтов (как unsigned char) в блоках памяти bl1 и bl2,
// возв-т: > 0, если bl1 > bl2; == 0, если bl1 == bl2; < 0, если bl1 < bl2
void *memcpy(void *bl1, const void *bl, size_t n); // копирует n байтов из
// bl в bl1, возв-т Ук на bl1
void *memmove(void *bl1, const void *bl, size_t n); // то же, что и memcpy(),
// но блоки bl1 и bl могут перекрываться
void *memset(void *arr, int ch, size_t n); // заполняет первые n байтов
// массива arr символом ch, возвращает arr
char *strcat(char *s1, const char *s2); // добавляет s2 к s1 (конкатенация)
char *strncat(char *s1, const char *s2, size_t n); // добавляет n символов
// s2 к s1 (конкатенация)
|
|
char *strchr(const char *s, int ch); // возв-т Ук на первое положение ch
// в s, иначе NULL
int strcmp(const char *s1, const char *s2); // сравнение s1 и s2 в лексико-
// графическом порядке (см. memcmp())
int strncmp(const char *s1, const char *s2, size_t n); // как memcmp()
char *strcpy(char *s1, const char *s2); // копирует s2 в s1, возв-т s1
char *strncpy(char *s1, const char *s2, size_t n); // копирует n первых
// символов s2 в s1, возв-т s1
size_t strlen(const char *s); // возв-т длину s в байтах
char *strpbrk(const char *s1, const char *s2); // возв-т Ук на первое
// вхождение символа из s2 в s1
char *strrchr(const char _FAR *s, int ch); // возв-т Ук на последнее
// вхождение ch в s
size_t strspn(const char *s1, const char *s2); // возв-т смещение от начала
// строк s1 и s2 до первого несовпадения символов в этих строках
size_t strcspn(const char *s1, const char *s2); // возв-т первую позицию i
// в s1, для которой символ s1[i] встречается и в s2
char *strstr(const char *s1, const char *s2); // возв-т Ук на первое
// вхождение s2 в s1
char *strtok(char *s1, const char *s2); // возв-т Ук на слово в s1 и исполь-
// зуется для выделения слов в s1. Разделителем слов является любой из сим-
// волов в s2. При первом вызове strtok() помещает в s1 NULL на место первого
// символа, совпадающего с одним из знаков в s2. При повторных вызовах strtok
// в качестве ее первого параметра нужно указывать NULL
char *strdup(const char *s); // возв-т Ук на копию s в динамической памяти
char *strlwr(char *s); // преобразует символы строки к нижнему регистру
char *strset(char *s, int ch); // заполняет символом ch строку s
|
|
char *strnset(char *s, int ch, size_t n); // заполняет символом ch n первых
// позиций строки s
char *strrev(char *s); // меняет порядок символов в s на обратный
char *strupr(char *s); // преобразует символы строки к верхнему регистру
// Программа 1.А (FUN_PTR.CPP). Функция, возвращающая указатель.
#include <iostream.h>
#include <stdlib.h> // функция exit(), константа NULL
char *str_sim(char *str1, char *str2, char sim);
// Функция возвращает указатель на ту из строк str1 или str2,
// в которой символ sim встречается больше раз
void main(void)
{ char *st1 = "Строка первая", // буква 'a' в строке - дважды
*st2 = "Ещё строка", // буква 'a' в строке - один раз
*st;
st = str_sim(st1, st2, 'а'); // 'а' - из русского алфавита!
if (st == NULL)
{ cout <<"\n В строках "<<st1 <<" и " <<st2 <<" символ"
<<" встречается одинаковое число раз"; exit(1);
}
cout <<endl <<st <<endl;
}
char *str_sim(char *str1, char *str2, char sim)
{ char *sp;
int k1 = 0, // число символов sim в строке str1
k2 = 0; // то же в строке str2
sp = str1;
while (*sp) { if (*sp == sim) k1++; sp++; }
sp = str2;
while (*sp) { if (*sp == sim) k2++; sp++; }
if (k1 == k2) return NULL;
if (k1 > k2) return str1;
return str2;
}
/* Программа 1.B (LEKS_WRD.CPP), использует функции вв/выв языка С.
Ввести строку - последовательность слов, разделенных одним из символов:.,:;!? или пробелом, и распечатать те из них, перед которыми стоят только лексикографически меньшие, а за ними - только большие слова.
Функция strtok(char *str, const char *divide) возвращает указатель на слово и используется для выделения слов из строки str. Разделителем слов считается любой из знаков в divide. При первом вызове strtok() помещает в str NULL на место первого символа, совпадающего с одним из знаков в divide. При повторных вызовах strtok() в качестве первого параметра нужно указывать NULL.
ТЕСТ: str = "ba ab,bb.bc;cd?ca!ee", результат: bb bc ee */
#include <stdio.h> // функция gets(char *str) вводит строку с пробелами
#include <conio.h> // функции: cputs(), putch(), getch()
#include <string.h> // для работы со строками
#define LEN 80 // длина вводимой строки
#define NUM_W 40 // количество слов в строке
void main()
{ int i, j, k = 0;
char str[LEN], // вводимая строка
*words[NUM_W], // массив указателей на слова в строке str
divide[] = ".,:;!? "; // cтрока знаков – разделителей
cputs("\n\r Введите строку: ");
gets(str);
words[k] = strtok(str, divide); // выделяется первое слово
while((words[++k] = strtok(NULL, divide))!= 0); //... остальные слова
cputs("Список упорядоченных слов: ");
for (i = 0; i < k; i++) // цикл по словам
{ for (j = 0; j < i; j++) // cлова слева от i-го слова if(strcmp(words[i], words[j]) < 0) goto following;
for (j = k-1; j > i; j--) // cлова справа от i-го слова
if(strcmp(words[i], words[j]) > 0) goto following;
cputs(words[i]); putch(' ');
following:
} getch(); // просмотр экрана до нажатия клавиши
}
/* Программа 1.C (SWORDS.CPP), использует функции вв/выв языка С.
Среди введенных слов вывести на экран сначала те, которые начинаются и оканчиваются одной и той же буквой, а затем - все остальные.
ТЕСТ: str = "aba ab,bb.bc;cd?exe", результат: aba bb exe ab bc cd */
#include <conio.h>
#include <stdio.h> // функция gets(), вводит строку с пробелами
#include <string.h> // для работы со строками
#define LEN 80 // максимальная длина вводимой строки
#define NUM_W 40 // максимальное количество слов в строке
void main()
{ int i, l, k = 0;
char str[LEN], // вводимая строка
*words[NUM_W], // массив указателей на слова в строке str
divide[] = ".,:;!? ", // cтрока знаков - разделителей
*p;
printf("\n Введите строку длиной не более %d символов: ", LEN-1);
gets(str);
str[LEN-1] = '\0'; // на случай недопустимо длинной строки
cputs("Слова в нужном порядке: ");
p = strtok(str, divide); // выделяется первое слово
while(p)
{ l = strlen(p); // длина строки
if (*p == *(p+l-1)) // если первая и последняя буквы в слове
|
|
{ cputs(p); putch(' '); } // равны, - слово на экран,
else words[k++] = p; // иначе - запись в массив слов
p = strtok(NULL, divide); // выделяются остальные слова
}
for (i = 0; i < k; i++)
{cputs(words[i]); putch(' '); } getch();
}
/* Программа 1.D (FIRST_VO.CPP).
Вывести на экран слова введенного текста (длинная строка), изменив каждое слово следующим образом: буквы слова, стоящие до первой гласной, перенести в конец слова.
ТЕСТ: str = "baba abba,buly.psi", результат: abab abba ulyb ips */
#include <iostream.h>
#include <string.h>
void main()
{ int j, len, k, N, p;
char *str, // вводимая строка
*vowel = "aeoiuy", // гласные буквы
*divide = ".,:;!? ", // строка знаков - разделителей
*word, // текущее слово
let1; // первая гласная буква
cout <<"\n Какова максимальная длина строки? ";
cin >>N;
cin.get(); // очистка буфера клавиатуры от символов, вводимых Enter
str = new char[N];
cout <<"Введите строку из слов: ";
cin.getline(str, N);
cout <<"Преобразованная строка: ";
word = strtok(str, divide);
while (word)
{ len = strlen(word);
for (j = 0; j < len; j++) // поиск в слове первой гласной буквы
if (strchr(vowel, word[j])!= NULL) break;
j %= len; // если гласных не было, положим j=0, для чего?
for (k = 0; k < j; k++) // j раз сдвигаем слово циклически на одну { let1 = word[0]; // букву влево
for (p = 0; p < len-1; p++) word[p] = word[p+1];
word[p] = let1;
}
cout <<word <<' ';
word = strtok(NULL, divide);
} cin.get(); // просмотр экрана до нажатия клавиши Enter
delete str; // освобождение памяти
}
/* Программа 1.E (INSTR_LN.CPP), использует функции вв/выв языка С++.
Вывести на экран аргументы командной строки в прямом порядке, если первым из них идет опция -s, и в обратном порядке, если первый аргумент - опция -r (саму опцию не выводить).
ТЕСТ: С:\BC31\MY_PROG> ins_line -r мне не дают книгу
На экране должно быть: книгу дают не мне */
//#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main(int argc, char *argv[]) // argc - количество аргументов
// в массиве argv, для теста:
|
|
// argc = 6, *argv[] = {"ins_line","-r","мне","не","дают","книгу" }
{ if (argc < 2)
{ puts("Нужны аргументы в командной строке! \n"); exit(-1); }
if (argv[1][0]=='-' && argv[1][1]=='s' && argv[1][2]=='\0')
{ ++argv; // вывод аргументов на экран, начиная с третьего
while (--argc > 1) printf((argc>2)?"%s ":"%s\n", *++argv);
}
else if(strcmp(argv[1], "-r") == 0) //... в обратном порядке
while (--argc>1) printf((argc>2)?"%s ":"%s\n", *(argv+argc));
else puts("Первым должен быть аргумент -s или -r");
getch();
}
/* Программа 1.F (HISTGRAM.CPP)
Построить на экране гистограмму числа вхождений каждой строчной латинской буквы в текст. Конец ввода последовательности букв - признак конца файла (EOF) - клавиши Ctrl+Z, Enter */
#include <iostream.h>
#include <conio.h>
void main()
{ int i, j, c, max;
static int histgrm[26]; // число вхождений каждой буквы в текст
char hist_str[53], // очередная строка в гистограмме
ch;
for (i = 0; i < 52; i++) hist_str[i] = ' ';
hist_str[52] = '\0';
cout <<"Введите текст, заканчивающийся EOF: Ctrl+Z, Enter \n";
while ((c = cin.get())!= EOF)
if(c >= 'a' && c <= 'z') histgrm[c-'a']++;
// находим максимальное число вхождений букв в текст, это и будет
// количество строк в гистограмме
max = histgrm[0];
for (i = 1; i < 26; i++) if(histgrm[i] > max) max = histgrm[i];
for (i = max; i >= 1; i--) // вывод гистограммы на экран
{ for (j = 0; j < 26; j++)
if (histgrm[j] == i) hist_str[2*j+1] = '*';
cout <<hist_str <<endl;
}
for (ch = 'a'; ch <= 'z'; ch++) cout <<' ' <<ch;
cout <<endl; getch();
}