4867

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

Лекция

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

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

Русский

2012-11-28

47 KB

7 чел.

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

Несмотря на то, что в состав стандартной библиотеки С++ входит специализированный тип данных для работы со строками 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.

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


 

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

77536. ГЕНЕТИЧЕСКИЕ АЛГОРИТМЫ И ИХ ПРИМЕНЕНИЕ 299 KB
  В животной клетке каждая молекула ДНК окружена оболочкой – такое образование называется хромосомой. Основная часть хромосомы нить ДНК определяющая какие химические реакции будут происходить в данной клетке как она будет развиваться и как функции выполнять. В каждой соматической клетке человека содержится 46 хромосом. Эти 46 хромосом на самом деле 23 пары причем в каждой паре одна из хромосом получена от отца а вторая от матери.
77537. РАСПОЗНАВАНИЕ ОБРАЗОВ И СИТУАЦИЙ 89 KB
  Суть задачи распознавания – установить обладают ли изучаемые объекты фиксированным конечным набором признаков позволяющим отнести и ке определенному классу. Цели науки распознавания образов: замена человеческого эксперта или сложной экспертной системы более простой системой автоматизация деятельности человека или упрощение сложных систем; построение обучающихся систем которые умеют принимать решения без указания четких правил а именно систем которые умеют сами синтезировать правила принятия решений на основе некоторого конечного...
77538. МУЛЬТИ-АГЕНТНЫЕ ИНТЕЛЛЕКТУАЛЬНЫЕ СИСТЕМЫ 96.5 KB
  Системы группового управления должны обеспечить возможность быстрой перестройки производства к изменению типа и объёма выпускаемой продукции в изменяющейся среде. Первоначально были разработаны принципы централизованного и децентрализованного группового управления сложными робототехническими системами. При децентрализованном управлении использовались распределённая группа микропроцессоров встроенных в локальные системы управления гибко программирующие поведение роботов и оборудования в соответствии с заданной в реальном времени...
77539. ИНТЕЛЛЕКТУАЛЬНЫЕ СИСТЕМЫ УПРАВЛЕНИЯ 66 KB
  Изменения во внешней среде влияют не только на сам МО но и на выбор требований к цели и качеству управления и как следствие на характер желаемых траекторий движения рабочих органов. Современные МО должны обладать возможностями выполнения функций принятия решений и управления близкими к интеллектуальным функциям человека а по скорости получения решений существенно превышать возможности человека. Эти функции реализуются с помощью современных средств вычислительной техники в интеллектуальных системах управления ИСУ.
77540. Основы искусственного интеллекта (ИИ). Создание высокоавтоматизированных производств 111 KB
  Прогресс в области информатизации практически всех сфер деятельности человека, в том числе в мехатронике и робототехнике связан с тем, что часть интеллектуальной нагрузки берут на себя компьютеры. Одним из способов достигнуть максимального прогресса в этой области, является искусственный интеллект
77541. Представление знаний о внешнем мире в интеллектуальных системах 146.5 KB
  Определение того что представлять и как представлять знания. Для функционирования ИС требуются следующие знания: знания о процессе решения задачи; знания о языке общения и способах организации диалога используемые лингвинистическим процессором; знания о способах представления модификации знаний используемые компонентом приобретения знаний; поддерживающие структурные и управляющие знания используемые объяснительным компонентом; знания о методах взаимодействия с внешним окружением; знания о модели внешнего мира. Знания....
77542. Продукционные модели знаний 87.5 KB
  Продукционные модели знаний занимают особое положение, т. к. они являются наиболее декларативным способом представления знаний. Продукционная модель представления знаний – это набор правил вила
77543. Семантические сети и их особенности 108.5 KB
  В бытовом понимании семантика означает смысл слова, действия, художественного произведения и т.п. Семантическая сеть – это граф, вершинам которого сопоставляются понятия (объекты, процессы, явления), дуги графа – это отношения между вершинами.
77544. Крепостное право и кодификация законов 213 KB
  Понять, как положение крепостных отражено в праве. Проанализировать, как сочетаются крепостное право и абсолютизм. Разобраться в том, какие права были у помещиков, а какие у крепостных. Найти ответ на вопрос, что представляло собой крепостное право в эпоху оформления законов и сохранения крепостничества.