Поиск

Полнотекстовый поиск:
Где искать:
везде
только в названии
только в тексте
Выводить:
описание
слова в тексте
только заголовок

Рекомендуем ознакомиться

Информатика, программирование->Реферат
Топология сети – это классификационный признак сети, который определяет принцип соединения компьютеров (рабочих станций, машин) в единую сеть. Существ...полностью>>
Информатика, программирование->Доклад
В основе любой сети лежит аппаратный слой стандартизованных компьютерных платформ, т.е. система конечного пользователя сети, в качестве которого может...полностью>>
Информатика, программирование->Контрольная работа
Вы, очевидно, знаете, что модем — это устройство, предназначенное для работы компьютера во Всемирной компьютерной сети Интернет. Появление модемов ста...полностью>>
Информатика, программирование->Реферат
Когда скорость выполнения программ и их количество стало увеличиваться, простои компьютера между запусками программ стали составлять значительное врем...полностью>>

Главная > Лекция >Информатика, программирование

Сохрани ссылку в одной из сетей:

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

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

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.

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


Загрузить файл

Похожие страницы:

  1. Массивы. И работа с ними в языке Pascal

    Лекция >> Информатика, программирование
    ... т. к. помимо цифр допустимыми символами являются символ-разделитель (запятая или точка ... элементов массива. Каждый элемент массива, начиная с первого, сравнивается со следующим, ... во второй строке таблицы). При работе с таблицами (массивами) удобно использовать ...
  2. Массивы как наборы данных одного типа

    Лекция >> Информатика, программирование
    ... в объявлениях с явной инициализацией элементов массива. Элементы массива имеют свои порядковые номера (индексы ... массива индексы массива изменяются от 0 до L-1, где L – размер массива по координате соответствующей мерности массива ...
  3. Основные принципы работы с статическими структурами данных, реализованными в языке Delphi

    Реферат >> Информатика, программирование
    ... массива А: Vs:=A[4]; {Vs - вспомогательная переменная} A[4]:=А[1]; 2.2. Строки Строка – это последовательность любых символов ... работе со строками используются стандартные функции и процедуры (табл. 2.2). Таблица 2.2. Процедуры и функции работы со строками ...
  4. Программирование на С#. Методические указания к лабораторным работам

    Книга >> Информатика, программирование
    ... Строки Основным типом при работе со строками является тип string, задающий строки ... s = textBox1.Text; } Однако со строкой символов трудно производить арифметические операции, поэтому ... окне, находится в массиве строк Lines, каждая строка которого имеет тип ...
  5. Основы микропрограммирования на языке Ассемблера. Лабораторные работы

    Лабораторная работа >> Информатика, программирование
    ... Организовать два массива по 5 ... Лабораторная работа №3 «Работа со строками» Цели изучить команды обработки строк и ... строки. Проверить вхождение каждого символа строки 1 в строку 2. Если какой-либо (первый слева) символ строки 1 не представлен в строке ...

Хочу больше похожих работ...

Generated in 0.0013918876647949