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.

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


 

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

21660. Гидрология рек 346.5 KB
  Главные реки и их притоки. Речная система включает в себя одну главную реку ряд притоков главной реки притоки этих притоков и т. Реки непосредственно впадающие в главную реку называются притоками первого порядка. Притоки второго порядка по отношению к главной реке реки впадающие в притоки первого порядка и т.
21661. ГЕОЛОГИЧЕСКАЯ ДЕЯТЕЛЬНОСТЬ ОКЕАНОВ И МОРЕЙ 78.5 KB
  Приливноотливные движения периодические поднятия и опускания уровня воды в океанах и морях возникают в результате того что Земля испытывает притяжение Луны и Солнца. РАЗРУШИТЕЛЬНАЯ ДЕЯТЕЛЬНОСТЬ МОРЯ Разрушительная деятельность моря называется абразией. К тому же между подводной абразионной террасой и клиффом возникает пляж представляющий гряды или насыпи гальки гравия иногда песка полого спускающиеся в сторону моря. При поперечном подходе волн к берегу в зоне прибоя в пределах пляжа часто формируются валы из...
21662. Химические и физические свойства природных вод 117 KB
  Основные физические свойства воды снега и льда Общие сведения. При анализе гидрологических явлений принимается что количество свободной воды на Земле сохраняется постоянным. Вода в результате некоторых процессов вступает в прочные соединения с другими веществами и перестает существовать как свободное образование однако в глубоких слоях земной коры имеют место и обратные процессы: при высоких давлениях и температурах вновь образуется некоторое количество воды. Температура замерзания дистиллированной воды принята за 0 С а температура...
21663. Гидрология озер 174 KB
  Гидрология озер Происхождение типы и морфология озерных котловин Озерами называются котловины или впадины земной поверхности заполненные водой и не имеющие прямого соединения с морем. Согласно приведенному определению к озерам могут быть отнесены и такие крупные водоемы как Каспийское и Аральское моря а также сравнительно небольшие временные скопления воды в понижениях местности образующиеся например в период весеннего снеготаяния. Иногда в отличие от текущих вод рек озера определяют как водоемы с замедленным стоком или с...
21664. Гидрология водохранилищ 70.5 KB
  Водохранилища в зависимости от их морфологических и гидрологических особенностей можно разделить на несколько групп. Течения в этих водохранилищах связаны больше всего с ветрами. Поэтому озерные водохранилища не имеют четко выраженной русловой формы и многократного превышения длины над максимальной шириной. Основными параметрами водохранилища являются объём площадь зеркала и амплитуда колебания уровней воды в условиях его эксплуатации.
21665. Гидрология ледников 62 KB
  Благодаря режеляции происходит слияние двух ледниковых потоков в один фирновые зерна смерзаются в плотную ледяную массу заплывают трещины в ледниках и т. Таким образом ледник может быть разделен на две части: верхнюю где преобладает накопление снега и льда фирновый бассейн или бассейн питания нижнюю где происходит стаивание ледника область стока область абляции язык ледника. Многочисленные наблюдения и специально поставленные опыты показали что течение ледника сходно с течением водного потока. Скорость движения льда в...
21666. Аналіз стратегічних зон господарювання 456 KB
  Матриця МакКінсіДженерал Електрик Матриця привабливості ринку. Портера матрицю Бостонської консультативної групи матриця росту матрицю Дженерал Електрик Мак Кінсі матриця привабливості ринку. Стратегічні господарські підрозділи які займають ліву верхню позицію моделі охоплюють вузький сегмент ринку і мають на ньому велику рентабельність оскільки їхні товари спеціалізовані. Небезпечним їхнє становище є тому що вони не мають конкурентних переваг на ринку і тому таке становище Портер назвав болотом .
21667. Розробка маркетингової стратегії 272 KB
  Розробка маркетингової стратегії Конкуренція на ринку схожа на війну. Складові маркетингової стратегії підприємства 2. Процес розробки маркетингової стратегії 3.
21668. Стратегічні маркетингові трансформації 83.5 KB
  Ключові компетенції компанії. Природа стратегічних маркетингових трансформацій Нагальна потреба рішучої зміни стратегії компанії виникає при наближенні або настанні кризової для компанії ситуації. До симптомів кризи звичайно відносять зниження прибутковості скорочення частки ринку компанії і втрату нею ліквідності. Настання кризи означає що організаційна інерція не дозволила компанії швидко і рішуче привести свою стратегію у відповідність з новим галузевим середовищем.