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.

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


 

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

36211. Классы численных методов построения множеств неулучшаемых решений. Основные теоремы для поточечных методов и алгоритма последовательного выбора 31.5 KB
  Процедуры первой группы осуществляют поочередный поиск отдельных неулучшаемых точек как решений вспомогательных скалярных задач. В них на каждой итерации получается целое множество âнеплохихâ точек которое на последующих шагах постепенно улучшается. Генератор на каждой итерации порождает набор точек zk а ФВ осуществляет отбор в некотором смысле лучших из них: Генератор множеств точек zk Функция выбора С Для организации выбора необходимо произвести парные сравнения исходных вариантов и отбросить те из...
36212. Эффективные и слабо-эффективные решения. Поточечные методы поиска слабо-эффективных решений и оценок. Линейная свёртка, теорема Карлина. Логическая свёртка, теорема Гермейера. Геометрический смысл теорем Карлина и Гермейера 79.5 KB
  Поточечные методы поиска слабоэффективных решений и оценок. Решения или оценки называются эффективными слабоэффективными если они неулучшаемы по отношению Парето Слейтера. Поиск слабоэффективных решений или оценок поточечными методами базируется на основной теореме 2.
36213. Метод наименьших квадратов (МНК). Теорема Гаусса-Маркова. Анализ уравнения регрессии посредством коэффициента детерминации и остаточной дисперсии. МНК-прогноз 112.5 KB
  МНКпрогноз. Согласно методу наименьших квадратов МНК эти оценки находят из условия минимума функции Qb = где уi наблюдаемое значение выходного параметра в iм эксперименте.1 МНКоценок и представляет прежде всего теоретический интерес.
36214. Понятие плана эксперимента. Оптимизационные свойства планов экспериментов. Полный факторный план и его свойства 46 KB
  Оптимизационные свойства планов экспериментов. Полный факторный план и его свойства. Одной из главных задач планирования экспериментов является выбор множества экспериментальных точек в некотором смысле оптимальных.
36215. Классификация математических моделей. Критерии качества моделей. Примеры моделей 66.5 KB
  Примеры моделей Суть моделирования состоит в замене исходного объекта упрощенной копией математической моделью ММ и дальнейшем изучении модели с помощью вычислительнологических алгоритмов реализуемых на компьютерах. При исследовании любой системы методами математического моделирования возможно наличие нескольких альтернативных вариантов модели. Поэтому процесс построения наилучшего как правило компромиссного варианта модели достаточно сложен. Системный подход предполагает наличие следующих этапов создания модели.
36216. Простейший поток и его свойства. Модель простейшего потока 61 KB
  Модель простейшего потока. Свойства ординарного потока. Тогда для любого случайного потока имеем равенство как сумма вероятностей полной группы событий. Для ординарного же потока имеем.
36217. Уравнения Колмогорова. Моделирование многоканальной СМО с ограничением на длину очереди 75.5 KB
  Моделирование многоканальной СМО с ограничением на длину очереди Марковские процессы уравнения Колмогорова Случайный процесс t называется Марковским если его будущее не зависит от прошлого а определяется настоящим т. Примерами Марковских процессов являются при определенных предположениях процессы функционирования СМО.1 СМО может иметь установившийся стационарный режим. Для построения модели стационарного режима СМО положим все производные в системе 11 равными нулю.
36218. Имитация Марковских процессов с непрерывным временем и дискретными состояниями. Планирование машинных экспериментов при имитационном моделировании 91.5 KB
  Например пусть 1 время через которое должен произойти переход в состояние Sj1 а 2 время через которое должен произойти переход в состояние Sj2. Обозначим Т время в течении которого будем наблюдать имитируемый процесс время прогона. Для тех дуг что i = k0 сформировать с помощью датчика случайных чисел k0 j время ожидания перехода Sk0 Sj. Определить время пребывания в состоянии Sk0 через какое время будет реальный переход в новое состояние.
36219. Классификация моделей оптимального синтеза. Методы релаксации в непрерывной оптимизации, условия сходимости. Алгоритмы градиентного метода и методов сопряжённых градиентов 119 KB
  Задача линейного программирования ЛП функции критериев qkx и ограничений fix линейны; если хотя бы одна из этих функций нелинейна то имеем задачу нелинейного программирования НЛП. Задача выпуклого программирования функции критериев qkx и ограничений fix выпуклые. Задача линейного целочисленного программирования функции критериев qkx и ограничений fix линейны контролируемые входные переменные хj целые числа. Оценка приращения функции Лемма 6.