int tolower(int c) нижний регистр
int toupper(int c) верхний регистр
Функции возвращают преобразованную букву.
Пример 5: Преобразовать символы к верхнему регистру (работа с указателем).
Функция toupper() преобразует свой аргумент к верхнему регистру.
…
char str[] = "Small text",*p;
for (p=str; *p!=0; p++)
printf ("%c",toupper(*p));
…
4. Работа со строками - <string.h>
Различают две группы функций:
- Функции, начинающимися с str, работают с С-строками (\0 - конец строки).
- Функции, начинающиеся с mem, работают с массивами символов, позволяя работать и с нулевыми байтами.
Общее правило:
функции, модифицирующие один из аргументов (напр.: копирование, слияние) всегда изменяют первый аргумент.
Функции группы str С-строки (\0 - конец строки).
char *strcpy(char *s1, char *s2)
копирует строку s2 в s1. Возвращает s1.
char *strcat(char *s1, char *s2)
объединяет строки s1 и s2 (дописывает s2 в s1). Возвращает s1.
int strcmp(char *s1, char *s2)
сравнивает строки. Возвращает 0 для совпадающих строк, отрицательное значение при s1<s2 и положительное при s1>s2.
int strlen(char *s1)
Возвращает длину строки s1
char *strchr(char *s1, char sim)
Возвращает указатель на первое вхождение символа sim в строку s1
char *strstr(char *s1, char *s2)
Возвращает указатель на первое вхождение строки s2 в строку s1
Аналогичные функции с контролем длины строки:
char *strncpy(char *s1, char *s2, size_t n)
копирует строку s2 в s1, но копируется не более n символов. Возвращает s1.
char *strncat(char *s1, char *s2, size_t n)
int strncmp(char *s1, char *s2, size_t n)
char *strerror(size_t n)
возвращает строку сообщения, соответсвующего ошибке с номером n.
- Функции группы mem аргументы -массивы символов, позволяют работать и с нулевыми байтами.
void *memcpy(void *dst, void *src, size_t len)
копирует len байтов (включая нулевые) из src в dst. Возвращает dst.
void *memove(void *dst, void *src, size_t len)
делает то же, что и memcpy. Это - единственная функция, которая правильно копирует перекрывающиеся объекты.
int memcmp(void *s1, void *s2, size_t len)
аналог strcmp, но с учетом нулевых байтов.
void *memset(void *s, int c, size_t len)
заполняет первые len байтов массива s символом c.
Пример 6: Выполнить различные действия с двумя строками, введенными с клавиатуры.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{char s1[80], s2[80];
int k=0,k1=0,k2=0,i;
/ / ввод строк с клавиатуры
cout<<"\nstr1->"; gets(s1);
cout<<"\nstr2->"; gets(s2);
// определение длины строк
cout<< "Длина строки 1: "<< strlen(s1)<<endl;
cout<< "Длина строки 2: "<< strlen(s2)<<endl;
// сравнение строк
if (!strcmp(s1,s2)) cout<<"Строки равны"<<endl;
else {cout<<"Строки не равны: ";
if (strcmp(s1,s2)>0) cout<<"cтрока1 больше строки2"<<endl;
else cout<<"cтрока2 больше строки1"<<endl;
}
// объединение строк
strcat(s1,s2);
cout<<s1<<endl;
// поиск эталона-символа в строке
if (strchr(s1,'!')) cout<<"! есть в "<<s1<<endl;
cout<<"символ р строит на "<<(strchr(s1,'р')-s1+1)<<" месте"<<endl;
// поиск эталона-строки в строке
if (strstr(s1,"ро")) cout<<"ро есть в "<<s1<<endl;
// копирование
Strncpy (s1, s2, 3); // копируем 3 символа из s2 в s1
strcpy (s2,"Копирование!");
cout<<"s1: "<<s1<<endl;
cout<<"s2: "<<s2<<endl;
return 0;
}
Пример 7: Ввести с клавиатуры несколько строк, запомнить их в массиве.
#include "stdafx.h"
#include <iostream>
#include <clocale>
#include <string.h>
using namespace std;
int main(int argc, char* argv[])
{char text[1000], q[80], *p;
int i, len=0, comlen=0, k;
// ВВОД ТЕКСТА В МАССИВ text С КЛАВИАТУРЫ:
// устанавливаем указатель p на начало массива text
// цикл ввода заканчиваем, когда введена пустая строка
// после записи очередной строки перемещаем указатель (+ длина строки)
for (p=text, k=0; strlen(q)!=0; p=p+len+1,k++)
{ gets(q); // ввод строки с клавиатуры
strcpy(p,q); // копирование в text
len= strlen(q); // определение длины строки
comlen +=len+1; // общая длина текста
}
cout<<"k="<<k<<endl;
cout<<"comlen="<<comlen<<endl;
// посимвольная работа с текстом
for (i=0; i<comlen; i++)
cout<<text[i];
cout<<endl;
// построчная работа с текстом
for (i=0, p=text; i<k; i++)
{ strcpy(q,p);
puts(q);
p=p+strlen(q)+1;
}
return 0;
}
Массивы:
text[1000] – для хранения текста в памяти
q[80] – для одной строки текста (при вводе и выводе)
Переменные:
comlen – общее количество введенных символов (включая символы «конец
строки»)
len – длина строки
k – количество строк
ВАРИАНТЫЗАДАНИЙ.
Общие требования.
1. Ввести данные с клавиатуры так как показано в примере 7:
– Объявить статический массив
– Вводить текст построчно с клавиатуры и также построчно размещать в памяти
– текст содержит латинские буквы, цифры, знаки.
2. При выполнении задания:
– использовать указатели
– создавать свои функции
– применять библиотечные функции
3. На экран выводить поясняющие тексты.
4. Выводить как исходный текст, так и текст после обработки (отформатированный).
Номер варианта задания | Задание |
1,10,19 | Ввести с клавиатуры несколько строк, признаком конца ввода считать строку, состоящую из слова «end». Во введенном тексте подсчитать количество цифр. Найти самое длинное и самое короткое слово в тексте, вывести на экран, если таких слов несколько – вывести их все. Вывести текст на экран и отформатировать: – Начать с «красной строки (табуляция) – Каждое предложение начинать с красной строки |
2,11,20 | Ввести с клавиатуры несколько строк, признаком конца ввода считать строку, состоящую из знака «.» или «!» Во введенном тексте подсчитать количество пробельных символов. Найти все слова с заданной длиной (число ввести с клавиатуры). Задать длину строки (ввести с клавиатуры) и вывести текст на экран в измененном виде. |
3,12,21 | Ввести с клавиатуры несколько строк, признаком конца ввода считать строку, состоящую из одного знака «#». Во введенном тексте подсчитать количество строчных символов. Найти все слова длиной больше заданного с клавиатуры значения. Разбить текст на страницы, параметры – длина страницы (число строк) и длина строки – вводятся с клавиатуры, слова - без переносов. |
4,13,22 | Ввести с клавиатуры несколько строк, преобразовать введенный текст к верхнему регистру, признаком конца ввода считать строку, состоящую из слова «finish». Во введенном тексте подсчитать количество слов. Вывести текст на экран и отформатировать: Выровнять правый край текста за счет увеличения промежутков между словами текста. |
5,14,23 | Ввести с клавиатуры несколько строк, признаком конца ввода считать строку, состоящую из слова «stop». Во введенном тексте подсчитать количество заглавных символов. В каждой строке найти самое длинное и самое короткое слово. Вывести текст на экран и отформатировать: В строке должны быть слова одинаковой длины, начать с самого короткого слова. |
6,15,24 | Ввести с клавиатуры несколько строк, преобразовать введенный текст к верхнему регистру, признаком конца ввода считать строку, состоящую из слова «ок». В четных строках подсчитать количество слов. Вывести текст на экран и отформатировать: Реализовать функцию «выровнять строки по центру». |
7,16,25 | Ввести с клавиатуры несколько строк, преобразовать введенный текст к нижнему регистру, признаком конца ввода считать строку, состоящую из одного знака «%». В нечетных строках подсчитать число цифр. Вывести текст на экран и отформатировать: Разбить текст на страницы, параметры (длину строки и количество строк) ввести с клавиатуры. |
8,17,26 | Ввести с клавиатуры несколько строк, признаком конца ввода считать строку, состоящую из одной точки. Во введенном тексте подсчитать количество заглавных и строчных символов. Вывести текст на экран и отформатировать: После точки начинать с «красной строки» |
9,18,27 | Ввести с клавиатуры несколько строк, состоящих из латинских букв, цифр и знаков препинания, признаком конца ввода считать строку, состоящую из слова «last». Во введенном тексте подсчитать количество цифр. Вывести текст на экран и отформатировать: Каждая последующая строка должна содержать на одно слово больше: в первой строке вывести одно слово, во второй – два и т.д. |