4867

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

Лекция

Информатика, кибернетика и программирование

Массивы символов. Работа со строками. Несмотря на то, что в состав стандартной библиотеки С++ входит специализированный тип данных для работы со строками string, очень часто для работы со строками используются массивы символов (char). Считается, что...

Русский

2012-11-28

47 KB

9 чел.

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

Несмотря на то, что в состав стандартной библиотеки С++ входит специализированный тип данных для работы со строками string, очень часто для работы со строками используются массивы символов (char). Считается, что строка хранится в массиве, начиная с его первого элемента (имеющего индекс 0), а для того, чтобы определить, где заканчиваются элементы массива, хранящие символы строки, после последнего символа добавляют специальный элемент «конец строки», имеющий численное значение равное 0. Строки, организованные таким способом, часто называют си-строками (C-string) или нуль-строками (null-terminated string). Таким образом, С-строка представляет собой смысловую «надстройку» над простым массивом char: всякая С-строка хранится в массиве char, и значит, с ней можно работать как с массивом, однако не всякий массив char можно назвать С-строкой. В следующем примере s1 не является С-строкой, т.к. не оканчивается символом «конец строки»:

 // s1 не является си-строкой

 char s1[] = { 'a', 'b', 'c', 'd' };

 // s2 является строкой ("abc")

 char s2[] = { 'a', 'b', 'c', 0 };

 // s3 является строкой ("abc")

 char s3[] = { 'a', 'b', 'c', '\0' };

 // s4 является строкой ("a")

 char s4[] = { 'a', 0, 'b', 'c' };

 // s5 является строкой (пустая строка, "")

 char s5[] = { 0, 'a', 'b', 'c', 'd' };

Таким образом, для хранения С-строки длиной в N символов необходим массив размером не меньше чем N+1 байт. Инициализировать строку можно используя строковые литералы (последовательность символов, ограниченная двойными кавычками), при этом null-символ «конец строки» будет автоматически добавлен в массив компилятором:

 char s1[] = "abcd"; // Заметим, что sizeof( s1 ) == 5 !

 

 Следующий пример реализует подсчет количества символов в С-строке (длину строки):

 

 char s[] = "abcde";

 int slen = 0;

 for ( int i = 0; s[i] != 0; ++i )

 ++slen;

 Заметим, что такая реализация вычисления длины строки имеет недостаток: в случае, если массив s окажется некорректной си-строкой, т.е. если в массиве отсутствует элемент «конец строки», то индекс в цикле может выйти за пределы массива s, что может привести к непредсказуемым последствиям. В следующем примере показана более безопасная реализация вычисления длины строки вместе с использованием метода getline для считывания строки из стандартного потока ввода.

#include <iostream>

int main()

{

setlocale( 0, "Rus" );

 

 const int MAX_SIZE = 128;

 char s[MAX_SIZE];

 // getline считывает строку, не большую MAX_SIZE-1 символов

 std::cin.getline( s, MAX_SIZE );

 

 int slen = 0;

 for ( int i = 0; ( i < MAX_SIZE ) && ( s[i] != 0 ); ++i )

 ++slen;

 

std::cout << "Длина строки \"" << s << "\" равна " << slen << std::endl;

 system( "pause" );

 return 0;

}

Разумеется, С-строки нельзя присваивать или сравнивать с помощью обычных операторов =, <, >, == и т.п. Для выполнения этих задач нужно применять соответствующие операции поочередно к каждому элементу массива:

char s1[] = "one";

if ( s1 == "one" ) // ошибка!

  // ...

Функция сравнения строк на равенство может выглядеть так:

bool strIsEqual( const char * s1, const char * s2 )

{

   for( int i = 0; s1[i] == s2[i]; ++i )

   {

      if ( s1[i] == '\0' )

         return true;

   }

   return false;

}

В стандартной библиотеке С++ имеется ряд функций, реализующих элементарные операции с С-строками (string.h). Ниже перечислены несколько наиболее часто используемых:

  •  int strcmp( char * s1, char * s2 ) – сравнивает две строки в соответствии с алфавитом. Если в соответствии с алфавитом строка s1 оказывается перед строкой s2, функция возвращает отрицательное целое. Если обе строки в соответствии с алфавитом идентичны, функция возвращает 0. Если в соответствии с алфавитом строка s1 оказывается после строки s2, функция возвращает положительное целое.
  •  int stricmp( char * s1, char * s2 ) – сравнивает две строки  в соответствии с алфавитом, аналогично strcmp, но без учета регистра.
  •  char * strcpy( char * dest, char * source )  – копирует строку source  в строку dest. В качестве результата возвращает указатель на строку dest.
  •  char * strcat( char * dest, char * source ) добавляет строку source в конец строки dest. Возвращает указатель на строку dest.
  •  int strlen( char * s ) – вычисляет длину строки.

Преобразование символов в числа.

Каждая цифра 0~9 может быть представлена соответствующим символом, поэтому любое число, хранящееся в компьютере может быть переведено в символьное представление (например, для вывода в файл или на экран) и наоборот. Поскольку символы, соответствующие цифрам, расположены в талице ASCII последовательно, чтобы получить символ, соответствующий цифре i, достаточно просто выполнить арифметическую операцию '0'+ i. Соответственно, перевод числа в символьное представление можно реализовать, разбив его на цифры и последовательно переведя их в символьное представление. Подобные операции также реализованы в стандартной библиотеке (stdlib.h):

  •  int atoi( char * s ) – преобразование символьного массива s в целое. В случае, если массив s невозможно преобразовать или он содержит недопустимые символы, функция возвращает 0.
  •  float atof( char * s ) – преобразование символьного массива s в число с плавающей точкой. Если массив s невозможно преобразовать или он содержит недопустимые символы, функция возвращает 0.
  •  char * itoa( int value, char * s, int base ) – преобразование целого value в символьную строку s в системе счисления с основанием base.

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


 

А также другие работы, которые могут Вас заинтересовать

78306. ОСНОВЫ МЕТРОЛОГИИ И ТЕХНИЧЕСКИХ ИЗМЕРЕНИЙ 341 KB
  В настоящее время к техническим измерениям рассматриваемым во взаимной связи с точностью и взаимозаменяемостью в машиностроении относят измерения линейных угловых и радиусных величин. Основные задачи метрологии ГОСТ 16263 установление единиц физических величин государственных эталонов и образцовых средств измерений контроля и...
78307. Метрология, стандартизация и сертификация, предмет курса и основные определения 126.5 KB
  Изделиями объектами в машиностроении являются детали сборочные единицы ранее назывались узлами а также механизмы и машины. На данном этапе конструктор консультируется с технологом по вопросам как проще и на каком виде станочного оборудования надо обрабатывать некоторые сложные детали и сборочные единицы. В данном предмете рассматриваются вопросы нормирования точности геометрических параметров элементов детали. Требования к точности нормируются по причине того что нельзя изготовить абсолютно точно элементы детали поскольку...
78308. СИСТЕМА ДОПУСКОВ И ПОСАДОК ДЛЯ ЭЛЕМЕНТОВ ДЕТАЛЕЙ С ГЛАДКОЙ ПОВЕРХНОСТЬЮ 953 KB
  Верхнее предельное отклонение отверстия и вала обозначим ES и es. Нижнее предельное отклонение отверстия и вала обозначим EI и ei. Номинальные размеры отверстия и вала будем принимать равными и обозначать соответственно Dн и dн. Допуск размера обозначается ТD для отверстия и Td для вала.
78309. НОРМИРОВАНИЕ ТОЧНОСТИ ФОРМЫ И РАСПОЛОЖЕНИЯ ПОВЕРХНОСТЕЙ ДЕТАЛЕЙ 964 KB
  Отклонение формы поверхностей Отклонением формы называется отклонение реальной поверхности или реального профиля от формы идеальной поверхности или идеального профиля. Допуск формы это величина в пределах которой может изменяться отклонение формы. Будем использовать следующие обозначения: Δ отклонение формы; Т допуск формы; L длина участка на котором определяется отклонение...
78310. НОРМИРОВАНИЕ ТРЕБОВАНИЙ К НЕРОВНОСТЯМ НА ПОВЕРХНОСТИ ЭЛЕМЕНТОВ ДЕТАЛЕЙ (ШЕРОХОВАТОСТЬ ПОВЕРХНОСТИ) 808.5 KB
  Базовая линия это линия заданной геометрической формы определенным образом проведенная относительно профиля и служащая для оценки геометрических параметров поверхностных неровностей. Короче говоря базовая линия при получении профиля поверхности элемента детали проводится в виде линии эквидистантной геометрической форме поверхности. Средняя линия профиля m это базовая линия имеющая форму номинального профиля и проведенная так что в пределах базовой длины среднее квадратичное отклонение профиля от этой линии минимально...
78311. НОРМИРОВАНИЕ ТОЧНОСТИ ДЕТАЛЕЙ, СОПРЯГАЕМЫХ С ПОДШИПНИКАМИ КАЧЕНИЯ 406 KB
  В подшипниках качения между поверхностью вращающейся детали и поверхностью опор располагаются шарики или ролики. Внутренний диаметр внутреннего кольца В ширина высота колец подшипника при одинаковой ширине наружного и внутреннего колец. Общий вид подшипника качения роликовый Класс точности подшипника характеризуется целым комплексом точностных требований относящихся к отклонениям размеров формы и расположения...
78312. ОБЕСПЕЧЕНИЕ ТОЧНОСТИ РАЗМЕРНЫХ ЦЕПЕЙ 312 KB
  Размерные цепи при образовании посадок: а для посадки с зазором; для посадки с натягом Если рассмотреть связи между размерами звеньев составляющих размерную цепь и замыкающим звеном можно увидеть особенность этих звеньев по которой все составляющие звенья цепи разделяются на увеличивающие и уменьшающие рис. необходимо решать вопрос о нормировании точности составляющих звеньев и точности замыкающего звена чтобы устройство образующее размерную цепь в виде отдельной детали или сборочной единицы выполняло свое служебное...
78313. Машины для соединения деталей и обработки узлов одежды физико-химическим и электро-физическим способами 19.28 KB
  Существует несколько видов сварки деталей из термопластичных одежных материалов. Разновидностью термоконтактного способа сварки является термоимпульсная сварка которая применяется для ПВХ и полиэтиленовых пленок. Оборудование при термоимпульсном способе сварки применяется в основном в виде прессов например УЗП2500 ДиЭлектро. Установки для ВЧ сварки включают в себя электроды механизм давления генератор ВЧ приборы контроля режима сварки и автоматического управления процессом.
78314. Дополнительные механизмы и устройства швейных машин 22.44 KB
  Приспособления для направления полуфабриката к иглам швейных машин в зависимости от типа шва выполняемого с их применением по классификации ЦНИИШП разбиты на 6 групп. В первую группу объединены приспособления для выполнения соединительных и отделочных швов без подгибания материалов. Во вторую третью и четвертую группы входят приспособления для выполнения таких швов где требуется подгибать один или несколько слоев материала. При этом во вторую группу входят приспособления где подгибание не связано с соединением деталей например...