Работа с текстом и строками


Содержание

Работа с текстом, состоящим из строк и со строками

Дан текст, состоящий из строк. Каждая строка состоит из слов, разделенных пробелами. Подсчитать количество различных слов в тексте, начинающихся и заканчивающихся одной и той же буквой и вывести их.

Хотя бы подскажите что и как делать, сайтец еще киньте какой-нибудь хороший на эту тему.

15.06.2014, 07:06

Работа со строками и текстом
Дано текст, вывести его, превратив таким образом: 1) Посчитать количество слов 2) Посчитать.

Автоматическое заполнение пустых строк, между строками с текстом
Вечер добрый. Подскажите как составить формулу для следующей ситуации. Есть столбец с текстами в.

Работа с текстом и строками в файлах
Даны два текстовых файла. Добавить в конец каждой строки первого файла соответствующую строку.

Работа з потоком, текстом, строками
Как текст имеющейся в .тхт-файле присвоить строке? StreamReader reader = new.

Работа с текстом, операции со строками
Друзья такое задание: Пусть дан текст «Я, ФИО, дата, месяц и год рождения. Определить 1) Слово.

Канал в Telegram

Вы здесь

Работа со строками в Excel. Текстовые функции Excel

Часто в Excel приходится тем или иным образом обрабатывать текстовые строки. Вручную такие операции проделывать очень сложно когда кол-во строк составляет не одну сотню. Для удобства в Excel реализован не плохой набор функций для работы со строковым набором данных. В этой статье я коротко опишу необходимые функции для работы со строками категории «Текстовые» и некоторые рассмотрим на примерах.

Функции категории «Текстовые»

Итак, рассмотрим основные и полезные функции категории «Текстовые», с остальными можно ознакомиться самостоятельно.

  • БАТТЕКСТ (Значение) – функция преобразующая число в текстовый тип;
  • ДЛСТР (Значение) – вспомогательная функция, очень полезна при работе со строками. Возвращает длину строки, т.е. кол-во символов содержащихся в строке;
  • ЗАМЕНИТЬ (Старый текст, Начальная позиция, число знаков, новый текст) – заменяет указанное кол-во знаков с определенной позиции в старом тексте на новый;
  • ЗНАЧЕН (Текст) – преобразует текст в число;
  • ЛЕВСИМВ (Строка, Кол-во знаков) – очень полезная функция, возвращает указанное кол-во символов, начиная с первого символа;
  • ПРАВСИМВ (Строка, Кол-во знаков) – аналог функции ЛЕВСИМВ, с той лишь разницей, что возврат символов с последнего символа строки;
  • НАЙТИ (текст для поиска, текст в котором ищем, начальная позиция) – функция возвращает позицию, с которой начинается вхождение искомого текста. Регистр символов учитывается. Если необходимо не различать регистр символов, воспользуйтесь функцией ПОИСК. Возвращается позиция только первого вхождения в строке!
  • ПОДСТАВИТЬ (текст, старый текст, новый текст, позиция) – интересная функция, на первый взгляд похожа на функцию ЗАМЕНИТЬ, но функция ПОДСТАВИТЬ способна заменить на новую подстроку все вхождения в строке, если опущен аргумент «позиция»;
  • ПСТР (Текст, Начальная позиция, Кол-во знаков) – функция похожа на ЛЕВСИМВ, но способна возвратить символы с указанной позиции:
  • СЦЕПИТЬ (Текст1, Текст 2 …. Текст 30) – функция позволяет соединить до 30-ти строк. Так же, можно воспользоваться символом «&», выглядеть будет так «=”Текст1” & ”Текст2” & ”Текст3”»;

Это в основном часто используемые функции при работе со строками. Теперь рассмотрим пару примеров, которые продемонстрируют работу некоторых функций.

Пример 1
Дан набор строк:

Необходимо из этих строк извлечь даты, номера накладных, а так же, добавить поле месяц для фильтрации строк по месяцам.

Извлечем в столбец В номера накладных. Для этого найдем так называемый ключевой символ или слово. В нашем примере видно, что перед каждым номером накладной стоит «№», а длина номера накладной 6 символов. Воспользуемся функциями НАЙТИ и ПСТР. Пишем в ячейку B2 следующую формулу :

= ПСТР (A2; НАЙТИ («№»;A2)+1;6)

Разберем формулу. Из строки А2 с позиции следующей после найденного знака «№», мы извлекаем 6 символов номера.

Теперь извлечем дату. Тут все просто. Дата расположена в конце строки и занимает 8 символов. Формула для С2 следующая:

= ПРАВСИМВ (A2;8)

но извлеченная дата у нас будет строкой, чтоб преобразовать ее в дату необходимо после извлечения, текст перевести в число:

= ЗНАЧЕН ( ПРАВСИМВ (A2;8))

а затем, задать формат отображения в ячейке, как это сделать было описано в статье «Формат данных в Excel».

Ну и последнее, для удобства дальнейшей фильтрации строк, введем столбец месяц, который мы получим из даты. Только для создания месяца нам необходимо откинуть день и заменить его на «01». Формула для D2:

= ЗНАЧЕН ( СЦЕПИТЬ («01»; ПРАВСИМВ (A2;6))) или = ЗНАЧЕН («01″& ПРАВСИМВ (A2;6))

Задайте формат ячеке «ММММ ГГГГ». Результат:

Пример 2
В строке «Пример работы со строками в Excel» необходимо все пробелы заменить на знак «_», так же перед словом «Excel» добавить «MS».

Формула будет следующая:

=ПОДСТАВИТЬ(ЗАМЕНИТЬ(A1;ПОИСК(«excel»;A1);0;»MS «);» «;»_»)

Для того, чтоб понять данную формулу, разбейте ее на три столбца. Начните с ПОИСК, последней будет ПОДСТАВИТЬ.

Все. Если есть вопросы, задавайте, не стесняйтесь

РАБОТА СО СТРОКАМИ

Понятие строки. Строка представляет собой массив символов, заканчивающийся нуль-символом — символом с кодом 0 0’). По положению нуль-символа определяется фактическая длина строки. Длина строки равна количеству символов, расположенных до нуль-символа. При резервировании памяти под строку необходимо выделить количество байт на 1 большее максимально возможной длины строки, так как один байт занимает символ — признак конца строки.

В программе строки описываются следующим образом:

где определяется как максимально необходимое число символов + 1(для нуль-символа).

Инициализация строк. Инициализация строк осуществляется по тем же правилам, что и инициализация одномерного массива, например:

char stl[6]=( , Н , ,’е’, , 1′, , 1′,’о’,»);

//инициализация строковой переменной массивом символов

//инициализация строковой переменной массивом символов

Существует и другой, более удобный способ инициализации строк, когда в качестве инициализирующего значения используется строковая константа, например:

//инициализация строковой переменной строковой константой

//инициализация строковой переменной строковой константой

char *ptext=»Указатель инициализирован этой строкой.»;

При инициализации указателей на строку компилятор добавит к строковой константе нуль-символ, затем подсчитает количество символов с учетом нуль-символа. При выполнении программы в динамической области памяти будет выделено количество байт, равное количеству символов в строковой константе с учетом нуль-символа, адрес этой области будет записан в указатель на строку и затем в выделенную область заносится инициализирующее значение.

Работа со строками. Строки можно вводить с клавиатуры, выводить на экран, сравнивать друг с другом, объединять несколько строк в одну, разбивать на слова, сортировать по алфавиту и т. д.

Приведем простой пример работы со строками:

char strl[] = «Hello, World!»; char str2[7] = «Hello,»; char *str3 = » World!»; printf(«%s «, strl); printf(«%s», str2); printf(«%s «, str3); return 0;

Пояснение. В этом примере при объявлении переменной strl количество символов не указано. В этом случае компилятор сам посчитает необходимое число байт для хранения строки и зарезервирует память. Строка str2 обязательно должна состоять из семи символов, включая символ — признак конца строки. В случае несоответствия будет сгенерирована ошибка компилятора. Для объявления третьей строки используется указатель на массив символов. Все строки выводятся на экран стандартной функций printf, с форматной спецификацией . Функция записывает в строковую переменную все символы до символа новой строки, не включая его, присоединяет к ним нуль-символ 0’) и возвращает указатель на введенную строку вызывающей программе.

Пример. Ввести строку символов, вывести ее на экран, вывести пятый символ строки. Для доступа к символам строки использовать указатели.

#include int main()

char text[81], *ptext;

//описание статической строки text и указателя на строку ptext printf(«Введите строку символов ( int main()

char textl[81], text2[81]; int number;

printf(«Введите 2 последовательности символов через пробел «);

number=scanf(«%s %s»,textl, text2);

printf(«Функция scant() считала %d строки: » %s» и «%s» «,number, textl, text2); return 0;

При выполнении этого фрагмента программы с клавиатуры можно будет ввести через пробел две последовательности символов, например,

Функция ввода scanf сначала считает с клавиатуры последовательность символов — «Изучай», запишет ее в строковую переменную textl, добавив в конец строки нуль-символ. Затем функция scant пропустит пустой символ (пробел), считает с клавиатуры последовательность символов — «программирование» и запишет ее в строковую переменную text2, добавив в конец строки нуль-символ. После этого количество считанных значений (2 — результат функции scant) будет присвоено переменной number.

Затем полученные результаты с помощью функции printf выводятся на экран.

Функция scant () считала две строки: «Изучай» и «программирование «.


Рассмотрим решение этой же задачи с использованием функции gets. Необходимо ввести с клавиатуры 2 последовательности символов, вывести их на экран.

printf(«Введите 2 последовательности символов через пробел «); gets(text);

printf(«Функция gets считала строку: » %s» «,

При выполнении этого фрагмента программы с клавиатуры можно будет ввести через пробел две последовательности символов, например,

Функция ввода gets считает с клавиатуры обе последовательности символов как одну последовательность — Изучай программирование, запишет ее в строковую переменную text, добавив в конец строки нуль-символ. Действие функции gets на этом закончится. Затем введенная строка с помощью функции printf выводится на экран.

Функция gets считала строку: «Изучай программирование»

Функции вывода строкputs() и printfO библиотеки stdio. Функция puts (char * ) имеет только один аргумент — указатель на строку. Функция выводит на экран все символы строки, пока ей не встретится нуль-символ. Если с помощью этой функции попытаться вывести на экран массив символов без завершающего нуль-символа, то функция puts станет перебирать все ячейки памяти в поисках нуль-символа, программа зависнет, а на экране будет непредсказуемая информация. Любая строка, выводимая с помощью функции puts (), печатается с новой строки, но после окончания работы функция puts () сама не переводит курсор в начало следующей строки экрана. В вызывающую программу puts () возвращает неотрицательное число.

Пример использования функции puts () для вывода строки:

char textl[]=»Массив инициализирован этой строкой.»; char *ptext2=»Указатель инициализирован этой строкой.»; puts(«Любая строка легко печатается с помощью puts О.»);

//печать строки начнется не с первого символа, а с четвертого puts (&text 1 [ 4 ] ) ; //печать строки начнется с пятого символа

Обратите внимание, что аргументом функции puts является указатель на строку, т. е. адрес первого символа, который нужно выводить на экран, затем выводится следующий символ и т. д., пока не встретится нуль-символ. При вызове функции puts (ptext2+3); аргументом этой функции будет указатель на символ с индексом 3 (адрес символа с индексом 3, т. е. указатель (адрес) на 4-й символ строки, начиная с которого и будет происходить вывод.

При вызове функции puts (&textl [4] ) ; аргументом функции будет адрес символа с индексом 4, т. е. адрес 5-го символа строки, начиная с которого и будет происходить вывод.

Функция printf () менее удобна, чем puts (), но она предоставляет дополнительные возможности вывода строк на экран. Она использует указатель строки в качестве аргумента, но не выводит каждую строку текста с новой строки. Зато с помощью функции printf () можно объединить последовательности символов для печати в единую строку. В вызывающую программу print f () возвращает число байт выводимой на экран информации. Приведем пример использования функции print f.

char text[81], *ptext;

//описание статической строки text и указателя на строку ptext printf(«Введите строку символов: «);

ptext=gets (text) ; /*ввод строки text с клавиатуры и присваивание адреса строки (значенияуказателя на строку) text указателю ptext*/ printf(«%s %s «, text, ptext);

//вывод введенной строки двумя способами

Работа со строками как с массивом символов

Так как строка представляет собой массив символов, то можно работать со строками как с обычными массивами. При этом необходимо помнить, что строка обязательно должна заканчиваться нуль-символом.

Пример 1. С клавиатуры ввести строку символов, подсчитать длину строки.

ttinclude int main()

char str[256], ch; int count = 0;

printf(«Введите строку >> «); gets(str); ch — str[0] ; while (ch != »)

printf(«Длина введенной строки = %d «, count); return 0;

Пример 2. Ввести строку, состоящую из нескольких предложений. Предложение заканчивается точкой. Определить число предложений в строке.

//описание строки //описание целой переменной — длины строки //описание переменнойколичества предложений

//задать начальное значение длине строки (к=0) //задать нач. значение количеству предложений 0 ‘ ) //пока к-й символ не равен нуль-символу

//если к-й символ равен точке //увеличить на 1 количество предложений //увеличить на 1 длину строки

printf(«Длина введенной строки =%d «,k);

printf(«Количество предложений в строке = %d «,count);

При работе со строками часто используются указатели. Используя указатель на начало строки, можно получить доступ ко всем ее символам.

Пример 3. Инициализировать строку, объявить два указателя на строку, инициализировать один из них адресом заданной строки, присвоить значение первого указателя второму. Напечатать строку, на которую указывают оба указателя, и их значения. Напечатать нулевой и шестой символы строки.

#include int main()

char *text=»He делай глупостей», *copy;

сору=text; //указатель сору теперь указывает на строку text

//печать нулевого символа строки (форматная спецификация %с) printf(«Нулевой символ строки: %с п», * сору);

//печать шестого символа строки, сору+6 — указатель на шестой символ printf(«Шестой символ строки: %с п», *( сору+6));

Пояснение. В программе строка text инициализируется строковой константой «Не делай глупостей». В программе описан указатель на строку *сору. С помощью оператора присваивания copy=text указателю сору присваивается значение указателя text, т. е. адрес строки text. Затем с помощью указателя сору и функции printf производится вывод строки на экран.

Так как строка — это массив символов, сору — указатель на нулевой символ массива (строки), используя операцию разыменования — *сору, получаем значение 0-го символа, который выводим на экран. Используя правила арифметики указателей и операцию разыменования — * (сору+6 ), получаем значение 6-го символа строки, который выводим на экран.

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

Библиотеки языка C++ содержат функции обработки строк. Прототипы этих функций находятся в файле string.h, поэтому в начале программы необходимо подключить заголовочный файл библиотеки string. Рассмотрим наиболее часто используемые функции strlen(),strcpy(), strcat(), strcmp(), strch():

int strlen(char *s) — определяет длину строки s, возвращает количество символов в строке, включая и последний нуль-символ ( ‘ 0 ‘ );

Илон Маск рекомендует:  Что такое девайс доступным языком!

char *strcpy(char *dest, const char *src) —копирует строку src в dest, возвращает указатель dest;

char *strcat(char *sl, char *s2) — присоединяет строку s2 в конец строки si ( предполагается, что длина строки si позволяет это сделать), возвращает указатель на объединенную строку (si);

int strcmp (char *sl, char *s2) — сравнивает две строки si и s2 , возвращает значение, полученное путем вычитания первых несовпадающих символов из si и s2;

char *strchr(char *s, int с) — находит в строке первое вхождение символа с, возвращает указатель на этот символ;

int strcspn(char *sl, char *s2) — находит длину отрезка строки si, содержащего символы, не входящие в множество символов строки s2.

Пример 1. Ввести две строки. Сравнить их. Объединить в одну. Найти первое вхождение первого символа первой строки во второй строке. Скопировать вторую строку в первую и вывести на экран первую.

#include int main()

char textl[81], text2[20], *ps, c; int j ;

puts(«Введите первую строку символов»); gets(textl);

puts(«Введите вторую строку символов»); gets(text2);

//иллюстрация работы функции strcmp()

if (j= =0) puts(«CTpoKH полностью совпадают»); if (j 0) puts(«Первая строка лексикографически больше второй»);

//объединение строк в одну с проверкой необходимой памяти

Таблица 9.1. Возможные значения параметра category

Относится ко всем категориям локализации

Оказывает влияние на выполнение функции эРгсоИ ()

Изменяет характер работы символьных функций

Определяет денежный формат

Изменяет символ десятичной точки для функций форматированного ввода-вывода

Определяет поведение функции эРг!:Р1те ()

Более подробную информацию о строках локализации можно посмотреть в документации на используемый компилятор.

#include //подключаем библиотеку для использования


int main () //функции setlocale

//устанавливаем локализацию для России printf(«Выводим сообщение на русском языке!п»);

//теперь можем выводить сообщения кириллицей

Пример 3. Ввести строку, состоящую из букв, цифр и пробелов. Определить количество слов в строке. Слова отделены друг от друга любым количеством пробелов. В начале и конце строки также может стоять любое количество пробелов:

#include int main()

char str[256], *p_str;

int lengthWord, countWord — 0;

//устанавливаем указатель p_s t г на начало введенной строки

//если символ, на который указывает ps, равен пробелу

p_s t г++; /*увеличить на 1 указатель на символ строки

(переходим к следующему символу строки)*/

//пока символ, на который указывает ps, равен пробелу if (*p_str!= 1 ‘)

//если текущий символ не равен нуль-символу (строка не кончилась) //увеличить на 1 количество слов

lengthWord = strcspn (p_str, » «); /* длина слова равна

длине отрезка в остатке строки, не содержащего пробелы, или длине остатка строки, если пробелов в остатке строки нет */ if (lengthWord == strlen(p_str))

//если длина слова равна длине остатка строки

//выходим из цикла

//устанавливаем указатель p_str на первый символ за выделенным словом

else break; //строка закончилась, выходим из цикла

printf(«countWord = %d «, countWord); return 0;

Пояснение. В программе описывается строковая переменная str, указатель на строку p_str, который будет использоваться как рабочая переменная, целые переменные lengthWord — длина выделяемого слова и countWord — количество слов.

После ввода строки str оператором p_str = str; устанавливаем указатель p_str на нулевой символ строки str. Затем во внешнем цикле do-while проверяем, является ли текущий символ (символ, на который указывает p_str) пробелом. Если да, то во внутреннем цикле do-while устанавливаем указатель p_str на следующий символ строки (остатка строки) str, проверяем, является ли новый символ пробелом, если да, то переходим к следующему символу. Выход из внутреннего цикла осуществляется, когда текущий символ станет не равен пробелу. То есть во внутреннем цикле пропускается несколько стоящих рядом пробелов.

Во внешнем цикле в условном операторе if (p_str ! = ‘ 0 ‘ ) проверяем, что текущий символ не является нуль-символом (строка не закончена). Если условие выполняется (строка не закончена), то увеличиваем на 1 количество слов, затем с помощью оператора lengthWord = strcspn (p_str, » «); определяем длину слова,

которая равна длине отрезка остатка строки, не содержащего пробелов, или длине остатка строки, если в нем нет пробелов.

Если длина выделенного слова равна длине остатка строки, выходим из цикла (все слова выделены). В противном случае оператором p_str += lengthWord; устанавливаем указатель p_str на первый символ за выделенным словом.

  • 1. Каким символом заканчивается строка?
  • а) ‘ п ?;
  • б) ‘ s ‘;
  • в) ‘ ‘.
  • 2. Что делает функция gets()?
  • а) считывает строку с клавиатуры до нажатия клавиши Enter;
  • б) считывает строку с клавиатуры до первого пробела;
  • в) выводит строку на экран.
  • 3. Что будет выведено на экран после выполнения следующей строчки?
  • а) Hello,;
  • б) Hello;
  • в) Hello, World!
  • 4. Укажите правильный вариант инициализации строки:
    • а) char str[] = «Программист»;
    • б) char str[12] = «Программист»;
    • в) оба варианта правильные.
  • 5. Какая строка форматной спецификации используется для вывода строки на экран?
  • а) %с;
  • б) %s;
  • в) %ss.
  • 6. Что будет выведено на экран в результате выполнения следующего кода?
  • 1. С клавиатуры ввести последовательность символов. Написать функцию, вычисляющую длину этой последовательности.
  • 2. С клавиатуры ввести предложение из нескольких слов, разделенных любым количеством пробелов. Написать функцию, вычисляющую количество слов в предложении.
  • 3. С клавиатуры ввести последовательность символов, не содержащую пробелов. Вывести на экран эту последовательность в обратном порядке («информатика» — «акитамрофни»).
  • 4. С клавиатуры ввести предложение, состоящее из произвольного числа слов. Написать функцию, которая подсчитывает количество повторяющихся слов в предложении.
  • 5. С клавиатуры ввести строку, состоящую из произвольного числа слов. Написать функцию, которая выводит на экран строку, в которой перевернуто каждое слово («мир труд май» — «рим дурт йам»).
  • 1. Что представляет собой строка в языке C++?
  • 2. Каким символом должна заканчиваться строка?
  • 3. С помощью каких функций можно считать последовательность символов с клавиатуры? В чем особенности применения этих функций?
  • 4. С помощью каких функций можно вывести последовательность символов на экран? В чем особенности применения этих функций?
  • 5. Как получить доступ к произвольному символу строки? Приведите примеры.
  • 6. Какой заголовочный файл необходимо подключить для использования стандартных функций работы со строками?
  • 7. С помощью каких функций можно вычислить длину строки, объединить, сравнить строки? Приведите примеры.
  • 8. Какие действия необходимо выполнить, чтобы в консольном приложении, созданном в среде Microsoft Visual Studio 2010, выводить на экран русские символы?

Python. Работа с текстом. Строки.

На уроке «Python. Взлом шифров. продолжение-2» я обещал рассказать о работе с текстом. Начнем со строк. Строки в Python-е, как и в PHP и JavaScript, могут заключаться в двойные или одинарные кавычки:

Это позволяет создать строки с кавычками внутри (либо с апострофами внутри):

Еще есть такая фича, как тройные кавычки. Они позволят задать многострочный стринг:

Другой способ задания многострочного текста — это использование символов «\n», хотя первый способ зачастую более наглядный. Вот этот код выполнит тоже самое:

Строки можно складывать (конкатенация):

Можно умножить строку на число, в этом случае она дублируется столько раз, на сколько ее умножили:

Но при попытке умножить на дробное число выйдет ошибка:

«Traceback (most recent call last):
File «D:/Самообразование/Python работа с тектом/text6.py», line 3, in
s=»Hello «*3.1
TypeError: can’t multiply sequence by non-int of type ‘float’»

Аналогично не «прокатит» и умножение строки на строку, так как данная операция не имеет смысла.

Кстати, при умножении строки на число от перестановки множителей произведение не меняется:

Такой код выдаст тоже самое, что и предыдущий. А вот со сложением данный номер не пройдет, так как там просто вторая строка с конца присоединяется к перовой.

К символам строки можно обращаться как к элементам массива, счет при этом начинается с нуля. Например, вот такой код вернет запятую:

Можно использовать срез. Например, вот такая программа вернет «lo,»:

Самый прикол, что можно получить каждый второй, каждый третьи и так далее символ из среза, например, каждый второй:

Такая программа вернет строку: «el,wr», а вот такая:

А еще в срезе могут быть отрицательные значения, это значит, что брать надо с конца. Например, если мы хотим получить предпоследний символ, мы можем написать [-2]. А вот если обратиться так: [:-2] то программа вернет все символы, кроме последних двух.

Теперь пара практических задач.

Задача 1. Дана строка со списком слов, разделенных пробелами. Надо найти самое длинной слово.

Решение. Вспомним урок Python. Взлом шифров. Продолжение, где для распарсиваняи строки мы использовали split. Тут поступим точно так же, распарсим строку, превратив ее в список, переберем все элементы списка, используя классический алгоритм поиска максимума:

Программа вернет «Слово с максимальной длиной: параллелепипед».

Задача 2. Необходимо анализировать сигнал. Этот сигнал состоит из цифр от 0 до 9 и знака #. Две и более идущие цифры подряд обозначают эту цифру. Если цифра должна повторяться, то это обозначается двумя или более знаками # (предыдущая цифра повторяется). Одинарная цифра или знак # считается помехой и не должен учитывается. Например, сочетание «12233##577766###» обозначает «233766».

Решение. Будем анализировать строку сигнала в цикле, меняя режим цикла, если идут два и более символа подряд. Последний символ и последнюю цифру запоминаем. Символ запоминаем чтобы отследить, что иду два и более подряд, а цифру для того, чтобы знак «#» удвоил ее.

BestProg


Работа со строками. Класс string . Конструкторы класса. Функции assign() , append() , insert() , replace() , erase() , find() , rfind() , compare() , c_str() . Примеры

Содержание

1. Какое назначение класса string в программах на C++?

Класс string предназначен для работы со строками типа char* , которые представляют собой строку с завершающим нулем. Класс string был введенн как альтернативный вариант для работы со строками типа char* . Строки, которые завершаются символом ‘\0’ еще называются C-строками. Поскольку, string есть классом, то можно объявлять объекты этого класса.

2. Какие модули (библиотеки) нужно подключить, чтобы использовать возможности класса string в MS Visual Studio C++?

Чтобы использовать возможности класса string в MS Visual Studio (C++), нужно подключить библиотеку и пространство имен std .

3. Каким образом осуществляется объявление переменной типа string ? Примеры

Объявление переменной типа string осуществляется точно так же как и обычной переменной. Возможный вариант объявления с одновременной инициализацией.

4. Какие преимущества и недостатки дает использование класса string в сравнении с типом char* ?

Создание нового типа string было обусловлено недостатками работы с строками символов, который демонстрировал тип char* . В сравнении с типом char* тип string имеет следующие основные преимущества:

  • возможность обработки строк стандартными операторами C++ ( = , + , = = , <> и т.п.). Как известно, при использовании типа char* даже наиболее простые операции со строками выглядели сложно и требовали написания чрезмерного программного кода;
  • обеспечение лучшей надежности (безопасности) программного кода. Например, при копировании строк, тип string обеспечивает соответствующие действия, которые могут возникнуть в случае, если строка-источник имеет больший размер чем строка-приемник;
  • обеспечение строки, как самостоятельного типа данных. Объявление типа string как строки есть единым для всех переменных в программе, которая обеспечивает непротиворечивость данных.

Основным недостатком типа string в сравнении с типом char* , есть замедленная скорость обработки данных. Это связано с тем, что тип string – это, фактически, контейнерный класс. А работа с классом требует дополнительной реализации программного кода, который, в свою очередь занимает лишнее время.

5. Какие операторы можно использовать с объектами класса string ?

Класс string есть удобен тем, что позволяет удобно манипулировать строками, используя стандартные (перегруженные) операторы.

С объектами класса string можно использовать нижеследующие операторы

  • = – присваивание
  • + – конкатенация (объединение строк)
  • += – присваивание с конкатенацией
  • == – равенство
  • != – неравенство
  • – меньше
  • – меньше или равно
  • > – больше
  • >= – больше или равно
  • [ ] – индексация

Пример, который демонстрирует использование вышеприведенных операторов

6. Содержит ли класс string конструкторы?

Как и любой класс, класс string имеет ряд конструкторов. Основные из них следующие:

7. Примеры инициализации с помощью конструкторов

Ниже приведены примеры инициализации переменных типа string

8. Присваивание строк. Функция assign() . Примеры

Чтобы присвоить одну строку другой, можно применить один из двух методов:

  • использовать оператор присваивания ‘=’ ;
  • использовать функцию assign() из класса string .

Функция assign() имеет несколько перегруженных реализаций.

Первый вариант – это вызов функции без параметров

В этом случае происходит простое присваивание одной строки другой.

Второй вариант позволяет копировать заданное количество символов из строки:

  • s – объект, из которого берется исходная строка;
  • st – индекс (позиция) в строке, из которой начинается копирование num символов;
  • num – количество символов, которые нужно скопировать из позиции st ;
  • size_type – порядковый тип данных.

Третий вариант функции assign() копирует в вызывающий объект первые num символов строки s :

  • s – строка, которая завершается символом ‘\0’ ;
  • num – количество символов, которые копируются в вызывающий объект. Копируются первые num символов из строки s .

Ниже приведен пример с разными реализациями функции assign() .

Пример.

9. Объединение строк. Функция append() . Пример

Для объединения строк используется функция append() . Для добавления строк также можно использовать операцию ‘+’ , например:

Однако, функция append() хорошо подходит, если нужно добавлять часть строки.

Функция имеет следующие варианты реализации:

В первом варианте реализации функция получает ссылку на строчный объект s , который добавляется к вызывающему объекту. Во втором варианте реализации функция получает указатель на строку типа const char * , которая завершается символом ‘\0’ .

Пример. Демонстрация работы функции append() .

10. Вставка символов в строке. Функция insert() . Пример

Чтобы вставить одну строку в заданную позицию другой строки нужно использовать функцию insert() , которая имеет несколько вариантов реализации.

Первый вариант функции позволяет вставить полностью всю строку s в заданную позицию start вызывающей строки (вызывающего объекта):

Второй вариант функции позволяет вставить часть (параметры insStart , num ) строки s в заданную позицию start вызывающей строки:

В вышеприведенных функциях:

  • s – строка, которая вставляется в вызывающую строку;
  • start – позиция в вызывающей строке, из которой осуществляется вставка строки s ;
  • insStart – позиция в строке s , из которой происходит вставка;
  • num – количество символов в строке s , которые вставляются с позиции insStart .
11. Замена символов в строке. Функция replace() . Пример

Функция replace() выполняет замену символов в вызывающей строке. Функция имеет следующие варианты реализации:

В первом варианте реализации вызывающая строка заменяется строкой s . Есть возможность задать позицию ( start ) и количество символов ( num ) в вызывающей строке, которые нужно заменить строкой s .

Второй вариант функции replace() отличается от первого тем, что позволяет заменять вызывающую строку только частью строки s . В этом случае задаются два дополнительных параметра: позиция replStart и количество символов в строке s , которые образуют подстроку, которая заменяет вызывающую строку.

Пример. Демонстрация работы функции replace() .

12. Удаление заданного количества символов из строки. Функция erase() . Пример

Для удаления символов из вызывающей строки используется функция erase() :

  • index – индекс (позиция), начиная из которой нужно удалить символы в вызывающей строке;
  • num – количество символов, которые удаляются.

Пример.

13. Поиск символа в строке. Функции find() и rfind() . Примеры

В классе string поиск строки в подстроке можно делать двумя способами, которые отличаются направлением поиска:

  • путем просмотра строки от начала до конца с помощью функции find() ;
  • путем просмотра строки от конца к началу функцией rfind() .


Прототип функции find() имеет вид:

  • s – подстрока, которая ищется в строке, что вызывает данную функцию. Функция осуществляет поиск первого вхождения строки s . Если подстрока s найдена в строке, что вызвала данную функцию, тогда возвращается позиция первого вхождения. В противном случае возвращается -1;
  • start – позиция, из которой осуществляется поиск.

Прототип функции rfind() имеет вид:

  • s – подстрока, которая ищется в вызывающей строке. Поиск подстроки в строке осуществляется от конца к началу. Если подстрока s найдена в вызывающей строке, то функция возвращает позицию первого вхождения. В противном случае функция возвращает -1;
  • npos – позиция последнего символа вызывающей строки;
  • start – позиция, из которой осуществляется поиск.

Пример 1. Фрагмент кода, который демонстрирует результат работы функции find()

Пример 2. Демонстрация работы функции rfind() .

14. Сравнение частей строк. Функция compare() . Пример

Поскольку тип string есть классом, то, чтобы сравнить две строки между собой можно использовать операцию ‘= =’ . Если две строки одинаковы, то результат сравнения будет true . В противном случае, результат сравнения будет false .

Но если нужно сравнить часть одной строки с другой, то для этого предусмотрена функция compare() .

Прототип функции compare() :

  • s – строка, которая сравнивается с вызывающей строкой;
  • start – позиция (индекс) в строке s , из которой начинается просмотр символов строки для сравнения;
  • num – количество символов в строке s , которые сравниваются с вызывающей строкой.

Функция работает следующим образом. Если вызывающая строка меньше строки s , то функция возвращает -1 (отрицательное значение). Если вызывающая строка больше строки s , функция возвращает 1 (положительное значение). Если две строки равны, функция возвращает 0.

Пример. Демонстрация работы функции compare() :

15. Получение строки с символом конца строки ‘\0’ ( char * ). Функция c_str() . Пример

Чтобы получить строку, которая заканчивается символом ‘\0’ используется функция c_str() .

Функция объявлена с модификатором const . Это означает, что функция не может изменять вызывающий объект (строку).

Пример 1. Преобразование типа string в const char * .

Пример 2.

Ниже продемонстрирован перевод строки из string в тип System::String для отображения его в элементе управления типа Label для приложений типа Windows Forms Application .

16. Как определить длину строки типа string ? Функция length()

Для определения количества символов в строке используется функция length() без параметров.

Работа с текстовыми строками

Текстовые строки – переменные типа string – могут содержать любое количество символов. Каждый символ представлен в кодировке UNICODE, предполагающей представление одного символа в 2 байтах памяти. Работа с текстовыми строками обычно предполагает решение следующих задач: объединить две (или более) строки в одну, вырезать из строки фрагмент, найти в строке заданную подстроку и т.п.

Для текстовых строк определены операции: конкатенации (объединение) строк, эта операция может быть выполнена при помощи оператора + или метода String.Сoncat, сравнение строк: операторы равенства == и !=. Оператор [] служит для доступа (только для чтения) к отдельным символам объекта string (см. пример на следующей странице и Примеры 6.1, 6.2, 6.3).

Например, объединение строк

string res = str1+ » «+ str2;

Строка res будет следующей: ”Катя Иванова”.

Этот же результат можно получить при помощи метода Concat

string res1 = String.Concat(str1, » «,str2);

В списке аргументов метода Сoncat может быть не более четырех членов. В приведенном выше примере их три.

Текстовые строки имеет сходство с массивами в том смысле, что доступ к отдельным символам осуществляется по индексу (номеру позиции, нумерация начинается с 0). Переход к следующему символу легко осуществляется изменением номера позиции на 1. Однако, следует иметь в виду, что изменение однажды созданной строки не допускается. Чтобы внести требуемые изменения, нужно создать новую строку (см. Пример 6.1) или использовать соответствующий метод.

Для работы со строками определены следующие методы класса String.

МетодSubstring(n, m) – извлечение подстроки длиной m, начиная с n-го символа. Если m не указано, то выводится весь «хвост» строки, начиная с n-го символа. Например, применение метода Substring для строки res

string str1 = «Катя»;

string str2 = «Иванова»;

string res = str1 + » » + str2;

string res2 = res.Substring(5, 7);

МетодInsert(n, st) – вставка подстроки st в исходную строку, начиная с n-ой позиции. При этом необходимо создать новую переменную, в которой вначале будет автоматически продублирована исходная строка, а затем выполнена необходимая операция. (Заметим, что в C# прямая модификация существующей строки невозможна.) Например,

string res3 = «Катя»;

string res4 = res3.Insert(4, » Иванова»);

В результате в res4 будет ”Катя Иванова”.

МетодReplace(st, st1) – замена подстроки st новой подстрокой st1 или замена какого-либо символа во всем тексте на другой символ. Например,

string str = «Катя Иванова»;

string str1 = str.Replace(«Катя»,»Екатерина»);

В результате будет str1 = «Екатерина Иванова».

МетодRemove(n, m)удаление из строки фрагмента заданной длины m, начинающегося с заданной позиции n. Например,

string res = «Катя Иванова – моя подруга»;

string res1 = res.Remove(4, 8);

Удаляются 8 символов, начиная с 4-го (пробел после слова ”Катя”). В результате будет res1 = ”Катя – моя подруга”.

Метод ToString() – получение строкового представления объекта числового типа. Внутри скобок может ничего не находиться, или может находиться переменная (строка формата), в которой указан способ форматирования числа, сохраненного в строковом виде, при выводе на консоль. Например,

string s = a.ToString(«f3»);

МетодSplit(применается к экземпляру класса String, как и описанные выше методы) осуществляет разбор строки, т.е. позволяет выделить отдельные слова или другие сочетания символов, разделенные какими-либо разделителями, перечисляемыми в массиве символов типа char[], являющемся аргументом метода Split. Например,

string str = «собака, кот играют вместе»;

string[] strarr = str.Split(new Char[] <' ',','>);

foreach(string res in strarr)

Здесь формируется массив strarr из слов исходного текста, отделенных друг от друга пробелом или запятой. Список символов-разделителей помещается в массив и передается методу Split в качесте аргумента.

При выводе после первого слова выведена пустая строка, т.к. после первого разделителя сразу следует второй и между ними ничего нет (пусто).

Каждый отдельный символ строки является значением типа char и может быть выделен в переменную типа char. Например, при выполнении оператора

для str из предыдущего примера s получит значение a.

Для работы с отдельными символами строки можно использовать методы структуры Char. Например, статический метод


Char.IsDigit(s), где s – переменная типа char (отдельный символ строки). Этот метод возвращает значение true, если s – цифра и false, если s – не цифра. Результат выполнения метода показывает, относится ли указанный символ Юникода к категории десятичных цифр или нет.

Использование этого и других подобных методов иллюстрируется в Примере 6.4.

Пример 6.1. В исходном тексте одно слово от другого отделено одним пробелом. Сформировать текст, в котором одно слово от другого отделяется двумя пробелами.

static void Main()

string str1 = «Введите верхний треугольник матрицы по строкам»;

static void Main()

string str1 = «текст верхний треугольник теекст треугольник верхний»;

string[] masstr = str1.Split(‘ ‘);

Дата добавления: 2015-02-07 ; просмотров: 824 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

Работа с текстовыми строками

Текстовые строки – переменные типа string – могут содержать любое количество символов. Каждый символ представлен в кодировке UNICODE, предполагающей представление одного символа в 2 байтах памяти. Работа с текстовыми строками обычно предполагает решение следующих задач: объединить две (или более) строки в одну, вырезать из строки фрагмент, найти в строке заданную подстроку и т.п.

Для текстовых строк определены операции: конкатенации (объединение) строк, эта операция может быть выполнена при помощи оператора + или метода String.Сoncat, сравнение строк: операторы равенства == и !=. Оператор [] служит для доступа (только для чтения) к отдельным символам объекта string (см. пример на следующей странице и Примеры 6.1, 6.2, 6.3).

Например, объединение строк

string res = str1+ » «+ str2;

Строка res будет следующей: ”Катя Иванова”.

Этот же результат можно получить при помощи метода Concat

string res1 = String.Concat(str1, » «,str2);

В списке аргументов метода Сoncat может быть не более четырех членов. В приведенном выше примере их три.

Текстовые строки имеет сходство с массивами в том смысле, что доступ к отдельным символам осуществляется по индексу (номеру позиции, нумерация начинается с 0). Переход к следующему символу легко осуществляется изменением номера позиции на 1. Однако, следует иметь в виду, что изменение однажды созданной строки не допускается. Чтобы внести требуемые изменения, нужно создать новую строку (см. Пример 6.1) или использовать соответствующий метод.

Для работы со строками определены следующие методы класса String.

МетодSubstring(n, m) – извлечение подстроки длиной m, начиная с n-го символа. Если m не указано, то выводится весь «хвост» строки, начиная с n-го символа. Например, применение метода Substring для строки res

string str1 = «Катя»;

string str2 = «Иванова»;

string res = str1 + » » + str2;

string res2 = res.Substring(5, 7);

МетодInsert(n, st) – вставка подстроки st в исходную строку, начиная с n-ой позиции. При этом необходимо создать новую переменную, в которой вначале будет автоматически продублирована исходная строка, а затем выполнена необходимая операция. (Заметим, что в C# прямая модификация существующей строки невозможна.) Например,

string res3 = «Катя»;

string res4 = res3.Insert(4, » Иванова»);

В результате в res4 будет ”Катя Иванова”.

МетодReplace(st, st1) – замена подстроки st новой подстрокой st1 или замена какого-либо символа во всем тексте на другой символ. Например,

string str = «Катя Иванова»;

string str1 = str.Replace(«Катя»,»Екатерина»);

В результате будет str1 = «Екатерина Иванова».

МетодRemove(n, m)удаление из строки фрагмента заданной длины m, начинающегося с заданной позиции n. Например,

string res = «Катя Иванова – моя подруга»;

string res1 = res.Remove(4, 8);

Удаляются 8 символов, начиная с 4-го (пробел после слова ”Катя”). В результате будет res1 = ”Катя – моя подруга”.

Метод ToString() – получение строкового представления объекта числового типа. Внутри скобок может ничего не находиться, или может находиться переменная (строка формата), в которой указан способ форматирования числа, сохраненного в строковом виде, при выводе на консоль. Например,

string s = a.ToString(«f3»);

МетодSplit(применается к экземпляру класса String, как и описанные выше методы) осуществляет разбор строки, т.е. позволяет выделить отдельные слова или другие сочетания символов, разделенные какими-либо разделителями, перечисляемыми в массиве символов типа char[], являющемся аргументом метода Split. Например,

string str = «собака, кот играют вместе»;

string[] strarr = str.Split(new Char[] <' ',','>);

foreach(string res in strarr)

Здесь формируется массив strarr из слов исходного текста, отделенных друг от друга пробелом или запятой. Список символов-разделителей помещается в массив и передается методу Split в качесте аргумента.

При выводе после первого слова выведена пустая строка, т.к. после первого разделителя сразу следует второй и между ними ничего нет (пусто).

Каждый отдельный символ строки является значением типа char и может быть выделен в переменную типа char. Например, при выполнении оператора

для str из предыдущего примера s получит значение a.

Для работы с отдельными символами строки можно использовать методы структуры Char. Например, статический метод

Char.IsDigit(s), где s – переменная типа char (отдельный символ строки). Этот метод возвращает значение true, если s – цифра и false, если s – не цифра. Результат выполнения метода показывает, относится ли указанный символ Юникода к категории десятичных цифр или нет.

Использование этого и других подобных методов иллюстрируется в Примере 6.4.

Пример 6.1. В исходном тексте одно слово от другого отделено одним пробелом. Сформировать текст, в котором одно слово от другого отделяется двумя пробелами.

static void Main()

string str1 = «Введите верхний треугольник матрицы по строкам»;

static void Main()

string str1 = «текст верхний треугольник теекст треугольник верхний»;

string[] masstr = str1.Split(‘ ‘);

Дата добавления: 2015-02-07 ; просмотров: 825 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

Работа со строками в 1С 8.3 и 8.2

Строка — примитивный тип данных в языке программирования 1С. Помимо 1С, этот тип данных используется во всех известных языках программирования, обычно он называется «string».

Функции работы со строками в 1С

Рассмотрим основные функции встроенного языка программирования 1С.

Строка

Функция Строка() позволяет получить текстовое представление переменных других типов.

СтрДлина


Функция позволяет получить количество символов в строке 1C, включая пробелы и незначащие символы.

СокрЛП, СокрЛ, СокрП

Полезная функция для удаления незначащих символов в строковом значении. СокрЛ обрабатывает символы, стоящие слева от последнего значащего символа, СокрП — справа. А СокрЛП — справа и слева.

Помимо пробелов, функция 1C удаляет такие символы, как перенос строки, неразрывный пробел и т.д.

Лев, Прав, Сред

С помощью данных функций очень просто получить первые (Лев) или последние (Прав) символы в строке, а также произвольное количество символов (Сред).

Найти

Функция для поиска подстроки внутри другой подстроки. Синтаксис Найти( , ). Функция возвращает число — номер позиции символа (или символов) в исходной подстроке. Если подстроки не найдено, вернётся число 0. Если в искомой подстроке есть несколько вхождений, вернется номер позиции первого совпадения.

ВРег, НРег, ТРег

Функции для управления регистром строки. ВРег — преобразует строку в верхний регистр. НРег — в нижний. ТРег — у каждого нового слова первая буква преобразуется в верхний регистр, остальные в нижний.

ПустаяСтрока

Функция, позволяющая сравнить исходную строку с пустой строкой. Проверяется наличие незначащих символов.

Получите 267 видеоуроков по 1С бесплатно:

Аналогично можно проверить строку на пустое значение следующим образом:

СтрЗаменить

Функция СтрЗаменить позволяет массово заменить искомое значение на нужное нам. Синтаксис:

СтрЧислоСтрок

Позволяет получить количество строк в многострочном тексте. Функция считает количество переносов строк (Символы.ПС).

Например, построчная обработка текстового фрагмента:

СтрПолучитьСтроку

С помощью данной функции можно получить произвольную строку из многострочного текста. Синтаксис — СтрПолучитьСтроку( , ).

СтрЧислоВхождений

Функция для подсчета числа вхождений произвольного фрагмента в строку. Например, подсчитать количество вхождений определенных символов или слов в текст.

Символ и КодСимвола

Две обратные функции. С помощью КодСимвола можно получить код символа в кодировке Unicode. Функцией Символ можно получить символ, зная Unicode кодификатор.

Часто встречающиеся задачи по работе со строками в 1С

Рассмотрим классические примеры решения задач в работе с текстовыми переменными.

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

Конкатенация, или объединение строк в 1С делается оператором «+».

Преобразовать число в строку

Тут всё просто. Достаточно использовать метод «Строка()»:

Однако может смущать наличие неразрывного пробела.

Его можно убрать с помощью замены неразрывного пробела на пустую строку:

или с помощью метода Формат:

Кавычки в строке 1С

Для новичков достаточно трудно установить кавычки внутри строки, хотя в этом нет ничего сложного. Достаточно внутри строки поставить вместо одних кавычек двое.

Символ переноса строки

Символ переноса строки необходим для переноса строки на следующую строку. В 1С это можно сделать с помощью специальной конструкции «Символы.ПС».

Сравнение строк в 1С

Сравнить строки достаточно просто с помощью оператора сравнения — «=».

Однако для получения корректного сравнения часто требуется возвести строки в один регистр и убрать незначащие символы:

Таким образом, мы получим более точное сравнение двух строк.

Убрать пробелы в строке 1С

Достаточно часто нужно убрать пробелы в строке 1С.

Если требуется убрать пробелы справа и слева:

Если требуется убрать абсолютно все пробелы, можно заменить их на пустую строку:

Если требуется убрать неразрывные пробелы из строки, которая получена из числового типа, сделать это можно так:

Другие статьи по 1С:

Если Вы начинаете изучать 1С программирование, рекомендуем наш курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Строки. Функции и методы строк

Итак, о работе со строками мы немного поговорили, теперь поговорим о функциях и методах строк.

Я постарался собрать здесь все строковые методы и функции, но если я что-то забыл — поправляйте.

Базовые операции

Длина строки (функция len)

Доступ по индексу

Как видно из примера, в Python возможен и доступ по отрицательному индексу, при этом отсчет идет от конца строки.

Оператор извлечения среза: [X:Y]. X – начало среза, а Y – окончание;

символ с номером Y в срез не входит. По умолчанию первый индекс равен 0, а второй — длине строки.

Кроме того, можно задать шаг, с которым нужно извлекать срез.

Другие функции и методы строк

При вызове методов необходимо помнить, что строки в Python относятся к категории неизменяемых последовательностей, то есть все функции и методы могут лишь создавать новую строку.

Поэтому все строковые методы возвращают новую строку, которую потом следует присвоить переменной.

Технология программирования на Си: представление матриц, работа с файлами и с текстами


Работа с текстами

Стандартная библиотека Си предоставляет набор функций для работы с текстами. К сожалению, большая часть из них ориентирована на представление символов в виде одного байта (во время разработки языка Си кодировка Unicode, в которой на символ отводится два байта, еще не существовала). Функции можно разделить на две группы:

  1. функции, определяющие тип символа, — является ли он буквой, цифрой, пробелом, знаком препинания и т.п. Эти функции описаны в стандартном заголовочном файле «ctype.h». Увы, функции, касающиеся букв, работают только для латинского алфавита;
  2. функции для работы с текстовыми строками. Строкой в Си считается последовательность байтов, ограниченная в конце нулевым байтом. Функции работы со строками описаны в стандартном заголовочном файле «string.h».

Определение типов символов

Библиотека Си предоставляет следующие функции для определения типа символов, описанные в стандартном заголовочном файле «ctype.h»:

int isdigit(int c); символ c — цифра;
int isalpha(int c); c — латинская буква;
int isspace(int c); c — пробел, перевод строки и т.п.;
int ispunkt(int c); c — знак препинания;
int isupper(int c); c — прописная латинская буква;
int islower(int c); c — строчная латинская буква;
int toupper(int c); если c — лат. буква, то преобразовать c к прописной букве;
int tolower(int c); если c — лат. буква, то преобразовать c к строчной букве.

Функции, начинающиеся с префикса is , возвращают ненулевое значение (т.е. истину), если символ с кодом c принадлежит указанному классу, и нулевое значение (ложь) в противном случае. Функции toupper и tolower преобразуют латинские буквы к верхнему или нижнему регистру, на остальных символах они действуют тождественно.

В качестве примера использования функции isspace модифицируем программу «wc.cpp», подсчитывающую число строк и символов в текстовом файле. Добавим в нее подсчет слов. Будем считать словами любые связные группы символов, разделенные пробелами, табуляциями или разделителями строк.

Пример выполнения программы wc2 в применении к собственному тексту, записанному в файле «wc2.cpp»:

Работа с текстовыми строками

Стандартная библиотека Си предоставляет средства вычисления длины строки, копирования, сравнения, соединения (конкатенации) строк, поиска вхождений одной строки в другую. Функции описаны в стандартном заголовочном файле «string.h». Прототипы наиболее часто используемых функций приведены ниже.

Определение длины строки

size_t strlen(const char *s); длина строки.

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

char *strcpy(char * dst , const char *src); копировать строку src в строку dst ;

char * strncpy (char * dst , const char *src, size_t maxlen); копировать строку src в dst , не более maxlen символов;

char * strcat (char * dst , const char *src); копировать строку src в конец dst (конкатенация строк).

Работа с произвольными массивами байтов

vo >dst , const void *src, size_t len); копировать область памяти с адресом src размером len байтов в область памяти с адресом dst ;

vo >dst , int value, size_t len); записать значение value в каждый из len байтов, начиная с адреса dst .

Сравнение строк

int strcmp (const char *s1, const char *s2); лексикографическое сравнение строк s1 и s2 . Результат нулевой, если строки равны, отрицательный, если первая строка меньше второй, и положительный, если первая строка больше второй;

int strncmp (const char *s1, const char *s2, size_t maxlen); сравнение строк s1 и s2 , сравнивается не более maxlen символов;

int memcmp(const void *m1, const void *m2, size_t len); сравнение областей памяти с адресами m1 и m2 размером len каждая.

Поиск

char * strchr (const char *s, int c); найти первое вхождение символа c в строку s . Функция возвращает указатель на найденный символ или ноль в случае неудачи;

char * strstr (const char *s1, const char *s2); найти первое вхождение строки s2 в строку s1 . Функция возвращает указатель на найденную подстроку в s1 , равную строке s2 , или ноль в случае неудачи.

Пример: программа «Записная книжка»

В качестве примера работы с текстовой информацией рассмотрим программу «Записная книжка». Записная книжка хранит имена людей и их телефоны. Под именем понимается полное имя, включающее фамилию, имя, отчество в произвольном формате: имя представляется любой текстовой строкой. Телефон также представляется текстовой строкой (представление с помощью целого числа не подходит, потому что номер может быть очень длинным и содержать специальные символы, например, знак плюс).

Программа позволяет добавлять записи в записную книжку, удалять записи и искать номер телефона по имени. При поиске не обязательно вводить имя полностью, достаточно нескольких первых символов. Можно также распечатать содержимое всей записной книжки. В перерывах между запусками программы информация сохраняется в файле » NoteBook .dat».

Записная книжка соответствует структуре данных нагруженное множество, которая будет рассмотрена в разделе 4.6.1. и для которой имеется ряд реализаций, обеспечивающих быстрый поиск и модификацию. Мы, однако, ограничимся сейчас простейшей реализацией: не упорядочиваем записи по алфавиту и применяем последовательный поиск . Записи хранятся в массиве, его максимальный размер равен 1000 элементов. Новая запись добавляется в конец массива. При удалении записи из книжки последняя запись переписывается на место удаленной.

Для записей используется структурный тип NameRecord , определенный следующим образом:

Здесь поле name структуры является указателем на имя абонента, которое представляет собой текстовую строку. Номер телефона также задается строкой, указатель на которую записывается в поле phone . Пространство под строки захватывается в динамической памяти с помощью функции malloc . При удалении записи память освобождается с помощью функции free .

Записи хранятся в массиве records :

Константа MAXNAMES задает максимально возможный размер массива records . Текущее количество записей (т.е. реальный размер массива) хранится в переменной numRecords .

В начале работы программа вводит содержимое записной книжки из файла » NoteBook .dat, имя которого задается как константный указатель на константную строку:

В конце работы содержимое записной книжки сохраняется в файле. Для ввода используется функция loadNoteBook , для сохранения — функция saveNoteBook с прототипами

Каждой записи соответствует пара строк файла. Пусть, например, имя абонента «Иван Петров», телефон — «123-45-67». Этой записи соответствует пара строк

Записи в файле разделяются пустыми строками.

Сохранение файла выполняется только в случае, когда содержимое записной книжки изменялось в процессе работы. За это отвечает переменная

которая принимает значение true , если хотя бы раз была выполнена одна из команд, меняющих содержимое записной книжки.

Работа с записной книжкой происходит в интерактивном режиме. Пользователь вводит команду, программа ее выполняет. При выполнении команды программа просит ввести дополнительную информацию, если это необходимо, и печатает результат выполнения. Команды записываются латинскими буквами, чтобы исключить возможные проблемы с русскими кодировками. После команды может идти имя абонента. Реализованы следующие команды:

  • add — добавить запись. Программа просит ввести имя абонента, если оно не указано непосредственно после команды, затем его телефон, после этого запись добавляется в записную книжку, или телефон изменяется, если данное имя уже содержится в книжке;
  • remove — удалить запись. Программа просит ввести имя абонента, если оно не указано непосредственно после команды, и удаляет запись из книжки, если она там присутствует;
  • find — найти запись. Программа при необходимости просит ввести имя абонента и печатает либо его телефон, либо сообщение, что данного имени в книжке нет;
  • modify — изменить номер телефона. Программа просит ввести имя абонента, если оно не указано непосредственно после команды. Затем осуществляется поиск записи с данным именем. В случае успеха программа просит ввести новый номер телефона, после этого старый номер заменяется на новый; в противном случае, печатается сообщение, что имя не содержится в книжке;
  • show — напечатать записи, для которых имена начинаются с данного префикса. Если имя или начало имени не указано непосредственно после команды, то печатается все содержимое записной книжки. Если указано начало имени, то печатаются все записи, для которых начало имени совпадает с заданным;
  • help — напечатать подсказку;
  • quit — закончить работу.

Каждой команде соответствует отдельная функция, выполняющая команду. Например, команде add соответствует функция onAdd , команде find — функция onFind и т.д. Начало искомого имени и его длина, если имя указано в командной строке, передаются через статические переменные

Если имя не указано в командной строке, то для его ввода вызывается функция readName , которая просит пользователя ввести имя с клавиатуры, считывает имя и заполняет переменные namePrefix и namePrefixLen .

Для поиска записи с заданным началом имени используется функция search с прототипом

Ей передается начало искомого имени и индекс элемента массива, с которого начинается поиск. Второй аргумент нужен для того, чтобы последовательно находить имена с одинаковым префиксом (например, имена, начинающиеся с заданной буквы). Функция возвращает индекс найденного элемента в случае успеха или отрицательное значение -1 при неудаче. Применяется последовательный поиск , при котором просматриваются все элементы, начиная со стартовой позиции. Для сравнения имен используется стандартная функция strncmp (s1, s2, n) , которая сравнивает n первых символов строк s1 и s2 . При поиске в качестве s1 используется заданное начало имени, в качестве s2 — очередное имя из записной книжке, n равно длине начала имени.

Для ввода строки с клавиатуры мы используем вспомогательную функцию readLine с прототипом

Функция вводит строку из стандартного входного потока, используя библиотечную функцию fgets . Затем из конца строки удаляются символы-разделители строк » \r » и » \n «. Введенная строка помещается в массив buffer с максимальной длиной maxlen . Реальная длина введенной строки записывается в переменную, адрес которой передается через указатель len .

Полный текст программы:

Аргументы командной строки

До сих пор во всех примерах программ использовался ввод исходных данных либо с клавиатуры (т.е. из входного потока), либо из файла. Язык Си предоставляет также возможность указывать аргументы программы в командной строке.

Аргументы командной строки являются параметрами функции main , с которой начинается выполнение Си-программы. До сих пор применялся вариант функции main без параметров, однако, при необходимости доступа к аргументам командной строки можно использовать следующий заголовок функции main :

Здесь целая переменная argc равна числу аргументов, т.е. отдельных слов командной строки, а массив argv содержит указатели на строки, каждая из которых равна очередному слову командной строки. Нулевой элемент argv[0] равен имени программы. Таким образом, число аргументов argc всегда не меньше единицы.

Например, при запуске программы testprog с помощью командной строки

значение переменной argc будет равно 4, а массив argv будет содержать 4 строки » testprog «, » -x «, » abcd.txt » и » efgh.txt «.

В операционной системе Unix нулевой элемент массива argv содержит полный путь к файлу с выполняемой программой. В системах MS DOS и MS Windows строка argv[0] может быть равна как полному пути к файлу, так и первому слову командной строки (зависит от используемого командного процессора).

Пример программы, печатающей аргументы своей командной строки:

Разработка больших проектов

До сих пор все рассмотренные примеры программ на Си имели небольшой объем (за исключением, возможно, программы Записная книжка). Такие маленькие программы помещаются в один файл . Однако реальные проекты имеют, как правило, значительно больший объем, измеряемый десятками, а чаще сотнями тысяч строк. Реализовать такую программу в виде одного непрерывного текста, помещающегося в одном файле, невозможно. Большой проект разбивается на более или менее независимые модули, которые можно написать и отладить по отдельности. Обычно в один такой модуль выделяется группа функций, работающих над общими глобальными данными и в той или иной мере связанных логически между собой. В простейшем случае каждому модулю соответствуют два файла с исходными текстами: заголовочный, или h — файл , описывающий интерфейс модуля, и файл реализации — c — или cpp — файл . Заголовочный файл содержит прототипы функций модуля, описания констант и глобальных переменных, структур, определения используемых типов и т.п. Файл реализации содержит определения глобальных переменных (т.е. их описания без слова extern ), определения статических переменных, которые не экспортируются за пределы данного файла (т.е. описания со словом static ), реализацию глобальных функций, а также описания прототипов и реализацию вспомогательных функций, которые не экспортируются за пределы файла.

Технология тестирования и отладки отдельного модуля предполагает использование заглушек вместо функций из других модулей, вызываемых функциями данного модуля, в том случае, когда другие модули еще не реализованы.

Существуют различные подходы к разбиению проекта на модули. Наиболее популярна технология сверху вниз, когда основной модуль реализуется на первом шаге на основе нескольких вспомогательных, интерфейс которых формулируется по мере реализации основного модуля. На следующем шаге реализуются вспомогательные модули, для этого придумываются новые вспомогательные модули более низкого уровня и т.д., пока не дойдем до базовых исполнителей.

Удобнее всего разрабатывать большие проекты в объектно-ориентированных языках (C++, Java , C#, Visual Basic и др.). В них имеются понятия класса и пространства имен, использование которых значительно облегчает создание больших проектов. Класс — это, говоря упрощенно, набор функций, которые работают над общими данными. Функции называются методами класса, а общие данные — членами класса. Объектно-ориентированный язык позволяет создавать объекты класса, т.е. однотипные наборы данных, соответствующие описанию класса. Пространством имен в C++ или пакетом в Java называется набор классов и функций, логически связанных между собой, реализуемых и используемых совместно. Отдельные классы или пространства имен соответствуют модулям, на которые разбивается проект.

Отметим, что, даже не используя объектно-ориентированного языка, можно придерживаться объектно-ориентированного стиля программирования, т.е. выделять группы функций и общие глобальные или статические данные, над которыми эти функции работают. Такие группы, подобно классам, реализуются и отлаживаются как отдельные структурные единицы.

Пример небольшого проекта » Стековый калькулятор » будет рассмотрен в следующей главе, посвященной структурам данных.

Илон Маск рекомендует:  Что такое код pow степень
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL