Среда, 08.01.2025, 20:05
Главная Регистрация RSS поиск
Приветствую Вас, Гость
Меню сайта
Категории раздела
HTML [44]
Visual C++ и MFC [21]
c++ [78]
php [19]
Javascript [15]
C# [51]
загрузки [0]
XNA [10]
создание игр с помощью xna
Наш опрос
Каким языком программирования вы увлекаетесь
Всего ответов: 2420
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Реклама
Главная » Статьи » c++

Работа со строками в С++

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

Строка в С++ - это массив символов, оканчивающийся нулевым символом ('\0').

Таким образом, можно определить строки двумя способами: как массив символов или как указатель на первый символ строки, например:

char str1[10] = "string1"; // объявление строки с помощью массива символов

Итак, теперь подробнее. Вы уже знаете, что массив - это набор однородных значений. Так вот строка есть не что иное, как набор символов, и, соответственно, для хранения строк можно использовать символьные массивы. Например, строка "QWERTY" имет тип char[7], а пустая строка "" имеет тип char[1]. Почему char[1]? Именно потому, что любая строка завершается так называемым нулевым символом, то есть символом, код которого в ASCII-таблице равен 0 (этот символ также является escape-символом и его символьный эквивалент представляется как '\0'). Благодаря этому свойству Вы всегда можете определить конец строки, если у Вас строка занимает меньшее количество символов, чем то количество, которое было указано в квадратных скобках при оъявлении массива, т.е. определить фактическую длину строки, хранящейся в массиве.

Одна из замечательных особенностей при работе со строками - это возможность упрощенной начальной инициализации. Например,

Объявление char str[] = "ABCDE";  присваивает переменной-строке 
начальное значение "ABCDE". А точнее, создает массив из 6 символов: 
'A','B','C','D','E' и символа '\0'.

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

Сразу необходимо отметить, что С++ сам автоматически сделает последний элемент массива нулевым символом (а Вы уже помните, что любая строка обязательно заканчивается нулевым символом), то есть, хотя в данном случае Вы массиву str присваиваете строку "ABCDE", длина которой составляет 5 символов, C++ выделяет память под 6 символов, записывает туда строку и затем в последний (пятый при счете от 0) записывает нулевой символ.

Следует также отметить, что при начальной инициализации символьного массива (как и любого другого) можно указывать в квадратных скобках его размер с целью дальнейшего использования массива еще для каких-либо целей (например, для хранения другой какой-либо строки):

Объявление char str[10] = "ABCDE"; создает массив из 10 символов 
и первые пять элементов этого массива принимают значения 'A','B','C','D' 
и 'E' соответственно, остальные символы будут ноль-символы.

В данном случае в первые 5 элементов массива записывается строка "ABCDE", а всем остальным элементам присваиваются нули.

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

 char str[]={'A','B','C','D','E','\0'}; 

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

Типичная ошибка программирования. Не выделяется достаточно места в массиве символов для хранения нулевого символа, завершающего строку.

Типичная ошибка программирования. Создание или использование "строки", которая не содержит завершающего нулевого символа.

Типичная ошибка программирования. Путают символьные и строковые константы.

Символьная константа - это один символ, заключенный в апострофы, например: 'A' или '\n'. Строковая константа - это последовательность символов, заключенная в двойные кавычки. В числе символов строки могут находится любые символьные константы, например, "Visual C++\n" состоит из следующих символов: 'V', 'i', 's', 'u', 'a', 'l', ' ', 'C', '+', '+', '\n', '\0'. Таким образом, "A" - это строковая константа и состоит из двух символов: 'A' и '\0'. Соседние строковые константы транслятором "склеиваются", например: "АБВ" "ГДЕ" означает то же, что "АБВГДЕ".

Рассмотрим небольшой пример:

//Задана строка, скопировать ее в символьный массив. 
#include<iostream.h>
void main()
{
 char str1 [ ] = "1234567890", /* объявляем символьный массив str1 и 
 инициализируем его */
 str2[11]; // объявляем символьный массив без инициализации

/* в цикле пока не встретится конец строки присваиваем текущему элементу 
массива str2 символ из массива str1 
*/
 for(int i = 0; str1[i] != '\0'; i++) str2[i] = str1[i];

// копируем ноль-символ в str2.
 str2 [i] = '\0';

 cout << str2 << '\n'; // вывод строки на экран
}

Обратите внимание, выход из цикла происходит, когда str1[i] равно ноль-символу, т.е. ноль-символ не копируется в str2, следовательно это нужно сделать за циклом.

Еще одна особенность работы с символьными массивами - если элементы произвольного массива можно вводить с клавиатура и выводить на экран только по одному элементу в цикле, то в символьный массив можно ввести сразу всю строку, используя оператор ввода

cin >> Имя_массива; 
и, аналогичным образом, вывести сразу всю строку на экран, используя оператор вывода
cout << Имя_массива; 
Следует сразу отметить, что при вводе с клавиатуры строки оператор cin автоматически добавляет в конец строки нулевой символ, так что Вы должны учитывать этот факт при указании количества элементов при объявлении массива.

Например,

#include <iostream.h>
void main()
{
 char str[31]; // объявление символьного массива
 cout<<"Enter a string (max 30 symbols):";
 cin>>str; // ввод строки
 cout<<"\nYou enter string:"<<str; // вывод строки
}

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

Второй способ определения строки - это использование указателя на символ. Объявление

char *b;
задает переменную b, которая может содержать адрес некоторого объекта. Однако в данном случае компилятор не резервирует место для хранения символов и не инициализирует переменную b конкретным значением. Сделать это можно, например, присвоив b указатель на уже существующий символьный массив, или динамически выделить память под новый массив. Например,
#include<iostream.h>

void main()
{
 char str[] = "Здравствуй, мир!"; // объявляем символьный массив
 char *b; // объявляем указатель на символ
 b = &str[12]; // теперь b указывает на 12-ый символ str
 *b = 'M'; // присваиваем первому элементу b символ 'М'
 cout << b; // выводим строку b на экран (Мир!)
}
Пример с динамическим выделением памяти под строку смотрите в разделе "Работа со строками. Примеры", пример 3.

Итак, подведем итоги.

Это необходимо помнить:
  1. Строку можно определить как массив символов или как указатель на символ.
  2. Любая строка заканчивается нулевым символом. (Благодаря этому свойству Вы всегда можете определить конец строки, если у Вас строка занимает меньшее количество символов, чем то количество, которое было указано в квадратных скобках при обявлении массива).
  3. Для строк возможна упрощенная начальная инициализация (в сравнении с не символьными массивами).
  4. В символьный массив можно ввести сразу всю строку, используя оператор ввода cin>> Имя_массива;, и аналогичным образом вывести сразу всю строку на экран, используя оператор вывода cout<<Имя_массива;.
Категория: c++ | Добавил: slava (12.05.2011)
Просмотров: 23740 | Комментарии: 6 | Рейтинг: 4.3/7
Всего комментариев: 6
6 pilipyak2014  
0
Как вивести свой розклад так щоб норм було?

5 Игорь  
0
Помогите пожалуйста с этой задачей:
Напишите функцию void compare (char str1, char str2), сравнивающую 2 символьных массива. Функция main должна считывать две строки с клавиатуры, вызывать функцию compare, вывести результат её работы на экран.
Спасибо.

4 slava  
0
Вот еще метод преобразования строки в число
int n=atoi(str.c_str());

3 slava  
0
Со строкой все на много проще т.к строка это массив символов и мы просто перебираем эти символы
#include <iostream>
using namespace std;
#include <string>
void main()
{

string str;
cin>>str;

for(int i=0;i<str.length();i++)
{

cout<<str[i]<<"_";
}

}

2 slava  
0
Разбиение 5ти значного числа
void main()
{
int n,a,b,c,d,e;
cin>>n;

a=n/10000;
b=n/1000%10;
c=n/100%10;
d=n/10%10;
e=n%10;

cout<<a<<"*"<<b<<"*"<<c<<"*"<<d<<"*"<<e<<"="<<a*b*c*d*e;

}

1 nill  
0
ya bi xotel vvodit 5i znacniy cifri, abcde opublikavat e*d*c*b*a vot tak, c++ help me please

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]