Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Введите строку: Это простой тест



Вот ваша строка: Это простой тест

В этой программе следует обратить внимание на следующую инструкцию.

cout < < str;

Здесь (вместо привычного литерала) используется имя строкового массива. И хотя причина такого использования инструкции cout вам станет ясной после прочтения еще нескольких глав этой книги, пока кратко заметим, что имя символьного массива, который содержит строку, можно использовать везде, где допустимо применение строкового литерала.

При этом имейте в виду, что ни оператор " > > " , ни функция gets() не выполняют граничной проверки (на отсутствие нарушения границ массива). Поэтому, если пользователь введет строку, длина которой превышает размер массива, возможны неприятности, о которых упоминалось выше. Из сказанного следует, что оба описанных здесь варианта считывания строк с клавиатуры потенциально опасны. Однако после подробного рассмотрения С++-возможностей ввода-вывода в главе 18 мы узнаем способы, позволяющие обойти эту проблему.

Некоторые библиотечные функции обработки строк

Язык C++ поддерживает множество функций обработки строк. Самыми распространенными из них являются следующие.

Strcpy()

Strcat()

Strlen()

Strcmp()

Для вызова всех этих функций в программу необходимо включить заголовок < cstring> . Теперь познакомимся с каждой функцией в отдельности.

Функция strcpy()

Общий формат вызова функции strcpy() таков:

strcpy (to, from);

Функция strcpy() копирует содержимое строки from в строку to. Помните, что массив, используемый для хранения строки to, должен быть достаточно большим, чтобы в него можно было поместить строку из массива from. В противном случае массив to переполнится, т.е. произойдет выход за его границы, что может привести к разрушению программы.

Использование функции strcpy() демонстрируется в следующей программе, которая копирует строку " Привет" в строку str.

#include < iostream>

#include < cstring>

using namespace std;

Int main()

{

  char str[80];

  strcpy(str, " Привет" );

  cout < < str;

  return 0;

}

Функция strcat()

Обращение к функции strcat() имеет следующий формат.

strcat(s1, s2);

Функция strcat() присоединяет строку s2 к концу строки s1, при этом строка s2 не изменяется. Обе строки должны завершаться нулевым символом. Результат вызова этой функции, т.е. результирующая строка s1 также будет завершаться нулевым символом. Использование функции strcat() демонстрируется в следующей программе, которая должна вывести на экран строку " Привет всем! " .

#include < iostream>

#include < cstring>

using namespace std;

Int main()

{

  char s1[20], s2[10];

  strcpy(s1, " Привет" );

  strcpy(s2, " всем! " );

  strcat (s1, s2);

  cout < < s1;

  return 0;

}

Функция strcmp()

Обращение к функции strcmp() имеет следующий формат:

strcmp(s1, s2);

Функция strcmp() сравнивает строку s2 со строкой s1 и возвращает значение 0, если они равны. Если строка s1 лексикографически (т.е. в соответствии с алфавитным порядком) больше строки s2, возвращается положительное число. Если строка s1 лексикографически меньше строки s2, возвращается отрицательное число.

Использование функции strcmp() демонстрируется в следующей программе, которая служит для проверки правильности пароля, введенного пользователем (для ввода пароля с клавиатуры и его верификации служит функция password()).

#include < iostream>

#include < cstring>

#include < cstdio>

using namespace std;

bool password();

Int main()

{

  if(password()) cout < < " Вход разрешен.";

  else cout < < " В доступе отказано.";

  return 0;

}

// Функция возвращает значение true, если пароль принят, и значение false в противном случае.

Bool password()

{

  char s[80];

  cout < < " Введите пароль: ";

  gets(s);

  if(strcmp(s, " пароль" )) { // Строки различны.

    cout < < " Пароль недействителен.";

    return false;

  }

  // Сравниваемые строки совпадают.

  return true;

}

При использовании функции strcmp() важно помнить, что она возвращает число 0 (т.е. значение false), если сравниваемые строки равны. Следовательно, если вам необходимо выполнить определенные действия при условии совпадения строк, вы должны использовать оператор НЕ (! ). Например, при выполнении следующей программы запрос входных данных продолжается до тех пор, пока пользователь не введет слово " Выход" .

#include < iostream>

#include < cstdio>

#include < cstring>

using namespace std;

Int main()

{

  char s [80];

  for(;; ) {

    cout < < " Введите строку: ";

    gets (s);

    if(! strcmp(" Выход", s)) break;

  }

  return 0;

}

Функция strlen()

Общий формат вызова функции strlen() таков:

strlen(s);

Здесь s — строка. Функция strlen() возвращает длину строки, указанной аргументом s.

При выполнении следующей программы будет показана длина строки, введенной с клавиатуры.

#include < iostream>

#include < cstdio>

#include < cstring>

using namespace std;

Int main()

{

  char str[80];

  cout < < " Введите строку: "; gets(str);

  cout < < " Длина строки равна: " < < strlen(str);

  return 0;

}

Если пользователь введет строку " Привет всем! " , программа выведет на экране число 12. При подсчете символов, составляющих заданную строку, признак завершения строки (нулевой символ) не учитывается.

А при выполнении этой программы строка, введенная с клавиатуры, будет отображена на экране в обратном порядке. Например, при вводе слова " привет" программа отобразит слово " тевирп" . Помните, что строки представляют собой символьные массивы, которые позволяют ссылаться на каждый элемент (символ) в отдельности.

// Отображение строки в обратном порядке.

#include < iostream>

#include < cstdio>

#include < cstring>

using namespace std;

Int main()

{

  char str[80];

  int i;

  cout < < " Введите строку: ";

  gets(str);

  for(i=strlen(str)-1; i> =0; i--)

    cout < < str[i];

  return 0;

}

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

#include < iostream>

#include < cstdio>

#include < cstring>

using namespace std;

Int main()

{

  char s1[80], s2 [80];

  cout < < " Введите две строки: ";

  gets (s1); gets(s2);

  cout < < " Их длины равны: " < < strlen (s1);

  cout < < ' '< < strlen(s2) < < '';

  if(! strcmp(s1, s2)) cout < < " Строки равны ";

  else cout < < " Строки не равны ";

  strcat(s1, s2);

  cout < < s1 < < '';

  strcpy(s1, s2);

  cout < < s1 < < " и " < < s2 < < ' ';

  cout < < " теперь равны";

  return 0;

}

Если запустить эту программу на выполнение и по приглашению ввести строки " привет" и " всем" , то она отобразит на экране следующие результаты:

Их длины равны: 6 4

Строки не равны

Привет всем

Всем и всем теперь равны

Последнее напоминание: не забывайте, что функция strcmp() возвращает значение false, если строки равны. Поэтому, если вы проверяете равенство строк, необходимо использовать оператор "! " (НЕ), чтобы реверсировать условие (т.е. изменить его на обратное), как было показано в предыдущей программе.

Использование признака завершения строки

Факт завершения нулевыми символами всех С++-строк можно использовать для упрощения различных операций над ними. Следующий пример позволяет убедиться в том, насколько простой код требуется для замены всех символов строки их прописными эквивалентами.

// Преобразование символов строки в их прописные эквиваленты.

#include < iostream>

#include < cstring>

#include < cctype>

using namespace std;

Int main()

{

  char str[80];

  int i;

  strcpy(str, " test" );

  for(i=0; str[i]; i++) str[i] = toupper(str[i]);

    cout < < str;

  return 0;

}

Эта программа при выполнении выведет на экран слово TEST. Здесь используется библиотечная функция toupper(), которая возвращает прописной эквивалент своего символьного аргумента. Для вызова функции toupper() необходимо включить в программу заголовок < cctype> .

Обратите внимание на то, что в качестве условия завершения цикла for используется массив str, индексируемый управляющей переменной i (str[i]). Такой способ управления циклом вполне приемлем, поскольку за истинное значение в C++ принимается любое ненулевое значение. Вспомните, что все печатные символы представляются значениями, не равными нулю, и только символ, завершающий строку, равен нулю. Следовательно, этот цикл работает до тех пор, пока индекс не укажет на нулевой признак конца строки, т.е. пока значение str[i] не станет нулевым. Поскольку нулевой символ отмечает конец строки, цикл останавливается в точности там, где нужно. При дальнейшей работе с этой книгой вы увидите множество примеров, в которых нулевой признак конца строки используется подобным образом.

Важно! Помимо функции toupper(), стандартная библиотека C++ содержит много других функций обработки символов. Например, функцию toupper() дополняет функция tolower(), которая возвращает строчный эквивалент своего символьного аргумента. Часто используются такие функции, как isalpha(), isdigit(), isspace() и ispunct(), которые принимают символьный аргумент и определяют, принадлежит ли он к соответствующей категории. Например, функция isalpha() возвращает значение ИСТИНА, если ее аргументом является буква (элемент алфавита).

Двумерные массивы

В C++ можно использовать многомерные массивы. Простейший многомерный массив — двумерный. Двумерный массив, по сути, представляет собой список одномерных массивов. Чтобы объявить двумерный массив целочисленных значений размером 10x20 с именем twod, достаточно записать следующее:

int twod[10][20];

Обратите особое внимание на это объявление. В отличие от многих других языков программирования, в которых при объявлении массива значения размерностей отделяются запятыми, в C++ каждая размерность заключается в собственную пару квадратных скобок.

Чтобы получить доступ к элементу массива twod с координатами 3, 5, необходимо использовать запись twod[3][5]. В следующем примере в двумерный массив помещаются последовательные числа от 1 до 12.

#include < iostream>

using namespace std;

Int main()

{

  int t, i, num[3] [4];

  for(t=0; t< 3; ++t) {

    for(i=0; i< 4; ++i) {

      num[t][i] = (t*4)+i+l;

      cout < < num[t][i] < < ' ';

    }

    cout < < '';

  }

  return 0;

}

В этом примере элемент num[0][0] получит значение 1, элемент num[0][1] — значение 2, элемент num[0][2] — значение 3 и т.д. Значение элемента num[2][3] будет равно числу 12. Схематически этот массив можно представить, как показано на рис. 5.1.

В двумерном массиве позиция любого элемента определяется двумя индексами. Если представить двумерный массив в виде таблицы данных, то один индекс означает строку, а второй — столбец. Из этого следует, что, если к доступ элементам массива предоставить в порядке, в котором они реально хранятся в памяти, то правый индекс будет изменяться быстрее, чем левый.

Необходимо помнить, что место хранения для всех элементов массива определяется во время компиляции. Кроме того, память, выделенная для хранения массива, используется в течение всего времени существования массива. Для определения количества байтов памяти, занимаемой двумерным массивом, используйте следующую формулу.

число байтов = число строк х число столбцов х размер типа в байтах

Следовательно, двумерный целочисленный массив размерностью 10x5 занимает в памяти 10x5x2, т.е. 100 байт (если целочисленный тип имеет размер 2 байт).

Многомерные массивы

В C++, помимо двумерных, можно определять массивы трех и более измерений. Вот как объявляется многомерный массив.

тип имя[размер1] [размер2]... [размерN];

Например, с помощью следующего объявления создается трехмерный целочисленный массив размером 4x10x3.

int multidim[4][10][3];

Как упоминалось выше, память, выделенная для хранения всех элементов массива, используется в течение всего времени существования массива. Массивы с числом измерений, превышающим три, используются нечасто, хотя бы потому, что для их хранения требуется большой объем памяти. Например, хранение элементов четырехмерного символьного массива размером 10x6x9x4 займет 2 160 байт. А если каждую размерность увеличить в 10 раз, то занимаемая массивом память возрастет до 21 600 000 байт. Как видите, большие многомерные массивы способны " съесть" большой объем памяти, а программа, которая их использует, может очень быстро столкнуться с проблемой нехватки памяти.

Инициализация массивов

В C++ предусмотрена возможность инициализации массивов. Формат инициализации массивов подобен формату инициализации других переменных.

тип имя_массива [размер] = {список_значений};

Здесь элемент список_значений представляет собой список значений инициализации элементов массива, разделенных запятыми. Тип каждого значения инициализации должен быть совместим с базовым типом массива (элементом тип). Первое значение инициализации будет сохранено в первой позиции массива, второе значение — во второй и т.д. Обратите внимание на то, что точка с запятой ставится после закрывающей фигурной скобки (}).

Например, в следующем примере 10-элементный целочисленный массив инициализируется числами от 1 до 10.

int i [ 10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

После выполнения этой инструкции элемент i[0] получит значение 1, а элемент i[9] —значение 10.

Для символьных массивов, предназначенных для хранения строк, предусмотрен сокращенный вариант инициализации, который имеет такую форму,

char имя_массива[размер] = " строка";

Например, следующий фрагмент кода инициализирует массив str фразой " привет" ,

char str[7] = " привет";


Поделиться:



Популярное:

  1. B. 1. В США говорят по-английски. 2. Эта сумка сделана из кожи. 3. Окно разбито. 4. Владимир был построен в 10 веке. 5. Масло и сыр делают из молока. 6.Этот дом был построен моим дедом.
  2. III. Приёмы приготовления начинок и фаршей для тестяных блюд: пирогов, пельменей, вареников, пирожков
  3. III.2.4. Контрольные испытания (тестирование)
  4. IV. СООТНОШЕНИЕ СИМВОЛИЧЕСКИХ И ЕСТЕСТВЕННО-ЯЗЫКОВщХ СИСТЕМ КАК ФАКТОР, ОПРЕДЕЛЯЮЩИЙ ХАРАКТЕР КУЛЬТУРЫ
  5. S:Укажите вид предложения: Рассказать об этом человеке хотелось так, чтобы придерживаться фактов и чтобы было интересно. (Д.Гранин)
  6. V. ВОСПРИЯТИЕ ОКРУЖАЮЩЕЙ ДЕЙСТВИТЕЛЬНОСТИ. РОЛЬ СЛУХА В ЭТОМ ПРОЦЕССЕ
  7. X. Фонд оценочных средств для проведения промежуточной аттестации обучающихся
  8. А. Деньги – это всеобщий эквивалент стоимости товаров и услуг.
  9. Административное право – это совокупность правовых норм, регулирующих управленческую деятельность органов исполнительной власти.
  10. Аквабайкинг - Преднамеренное катание в аццкий дождь со всеми вытекающими. Традиционно все участники при этом остаются крайне довольны катушкой
  11. Аналогия — это зеркало, но не волшебное
  12. АТТЕСТАЦИОННЫЙ ЛИСТ ПО ПРАКТИКЕ


Последнее изменение этой страницы: 2016-03-17; Просмотров: 1502; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.072 с.)
Главная | Случайная страница | Обратная связь