Строковая переменная С является частично заполненным массивом символов. Подобно другим частично заполненным массивам, она содержит данные в идущих подряд элементах, начиная с нулевого. И в ней занято столько позиций, сколько нужно для хранения данных. Однако для отслеживания количества заполненных элементов массива ей не требуется отдельная переменная типа int. Информация о месте окончания строки содержится в ней самой - после последнего символа строки в строковой переменной С располагается специальный символ '\0'. Поэтому, если в переменной s содержится строка «Язык С++», элементы массива заполнены следующим образом:
s[0] | s[1] | s[2] | s[3] | s[4] | s[5] | s[6] | s[7] | s[8] | s[9] | s[10] |
Я | з | ы | к | С | + | + | \0 | ? | ? |
Объявление строковой переменной С
Строковая переменная С - это обычный массив символов, используемый особым образом. Она объявляется так же, как любой другой массив символов и имеет следующий синтаксис:
char имя_массива[максимальный _размер_строки_С +1];
Пример: charmy_c_stringC[12]:Единица прибавляется для того, чтобы массив вмещал нуль-символ ' \0', отмечающий конец хранящейся в массиве строки. В частности, строковая переменная my_c_string в приведенном выше примере вмещает строку С длиной в одиннадцать или менее символов.
Инициализация строковой переменной ССтроковую переменную С можно инициализировать при объявлении, как в следующем примере:
char my_string[] - "РТСУИиИС";
Эта инициализация автоматически помещает в конец строки С символ '\0'. Если в квадратных скобках не задано число, создается массив, длина которого на единицу больше длины помещаемой в него строки. Так, приведенный оператор объявляет массив my_string из одиннадцати индексированных переменных (десят для символов строки «РТСУ И и ИС» и один для нуль-символа '\0').
Таким образом, инициализируя строковую переменную С, можно опустить размер массива. C++ автоматически присвоит ей размер, который будет на единицу больше, чем длина заключенной в кавычки строки (один дополнительный элемент массива для символа '\0').
Ввод и вывод строкСтроки с можно выводить с помощью оператора вывода << и строковые переменные С можно заполнять, используя оператор ввода >> , но нужно
иметь в виду одно обстоятельство: как и для других типов данных, при вводе
строк С пропускаются символы пробела, табуляции и перевода строки. Более
того, на очередном из перечисленных символов процесс чтения входных данных останавливается.
Для того, чтобы программа прочитала всю строку с символами пробела
и табуляции, то можно прочитать ее по частям с помощью оператора ввода >>, а потом собрать в единое целое. Но это, во-первых, утомительно, а во-вторых, возникает проблема устранения символов пробела и табуляции. Гораздо проще и надежнее воспользоваться стандартной функцией-членом getline включенной в любой входной потоковый объект cin. Пока только укажем синтаксис использования этой функции, а основные ее характеристики опишем в разделе «Функция»:
cin. getline(my_string, максимдльноеколичествосимволов + 1)
Из потока cin считывается одна строка символов и помещается в переменную my_string. Если размер строки превышает максимальноеколичествосимволов, будет прочитана только ее начальная часть, равная по длине этому значению. (Единица прибавляется, так как каждая строка С содержит нуль-символ '\0', отмечающий ее конец, и поэтому строка в переменной строковая_перемениая на единицу длиннее прочитанной строки.)
Задание 17
Дана строка. Осуществить вывод отдельных слов строки. Разделителем являются пробел и знаки препинания.
Вариант 1. Без использования двухмерного массива строк.
int main(int argc, char *argv[])
{
char matn[100];
char split[15],delim[]=" .!?,;:/-";
cin. getline(matn,100);
bool slovo=false;
int i, j,k=0,n=strlen(matn),m=strlen(delim);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(matn[i]==delim[j])
slovo=true;
}
if(slovo==true)
{
if (k!=0)
{
for(int t=0;t<k;t++)
cout<<split[t];
cout<<endl;
}
k=0;
slovo=false;
}
else
{
split[k]=matn[i];
k++;
}
}
if (k!=0)
{
for(int t=0;t<k;t++)
cout<<split[t];
cout<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
Вариант 2. С использованием двухмерного массива строк.
int main(int argc, char *argv[])
{
char matn[100];
char split[100][15],delim[]=" .!?,/-";
cin. getline(matn,100);
bool slovo=false;
int i, j,k[100],k1=0,n=strlen(matn),m=strlen(delim);
for(i=0;i<n;i++)
{
k[i]=0;
for(j=0;j<m;j++)
{
if(matn[i]==delim[j])
slovo=true;
}
if(slovo==true)
{
if (k[k1]!=0)
k1++;
slovo=false;
}
else
{
split[k1][k[k1]]=matn[i];
k[k1]++;
}
}
cout<<k1<<endl;
for(i=0;i<k1;i++)
{
for(int t=0;t<k[i];t++)
cout<<split[i][t];
cout<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
Функции
Работа над программой начинается с выработки метода решения поставленной задачи и представления его в виде инструкций, предназначенных человеку, а не компьютеру. Такой набор инструкций называется алгоритмом. Наилучший подход к разработке алгоритма следующий: разбить начальную задачу на несколько подзадач, каждую из них разбить на меньшие подзадачи и т. д. Наконец будут выделены подзадачи столь малого размера, что реализовать их на языке C++ окажется совсем просто. Данная методика называется нисходящим проектированием (ее также называют пошаговой детализацией или методикой «разделяй и властвуй»).
Следуя этому методу, сначала разрабатывают алгоритмы, а затем реализуют их в виде программ и подпрограмм, сохраняя структуру «задача-подзадача». В результате получается понятная программа, которую в дальнейшем легко модифицировать, не говоря уже о том, что ее гораздо проще писать, тестировать и отлаживать. Как и большинство других языков программирования, C++ предоставляет специальные средства для реализации подзадач в виде отдельных частей программы. Такие части, в иных языках называемые подпрограммами или процедурами, в C++ именуются функциями.
Одно из преимуществ структурирования программы в виде набора функций - возможность распределения работы над проектом между несколькими программистами, пишущими каждый свою группу функций. Это особенно важно при создании крупных программ, которые невозможно разработать в одиночку в короткий срок, таких как компиляторы или офисные системы.
В состав C++ входят библиотеки стандартных функций, которые можно использовать в разрабатываемых программах. Значение, передаваемое функции при вызове, называется ее аргументом, а то, которое она вычисляет, - возвращаемым значением. Функция может иметь более одного аргумента, но возвращаемое значение у нее только одно. Ее можно представить как маленькую программу, аргументы которой аналогичны входным данным, а возвращаемое значение - выходным данным. Пользоваться функцией в программе очень просто: необходимо указать имя функции и значения аргументов. Это называется вызовом функции. Аргументами могут быть константа, переменная или более сложное выражение. Вызов функции является обыкновенным выражением, его можно использовать везде, где допускается применение выражения того типа, к которому относится возвращаемое функцией значение. Например, значение, возвращаемое функцией sqrt из библиотеки cmath, имеет тип doublе.
Вообще, вызов функции это выражение, состоящее из имени функции, за которым следуют аргументы, заключенные в круглые скобки. Если у функции более одного аргумента, их разделяют запятыми. Вызов функции может использоваться как любое другое выражение, тип которого соответствует типу возвращаемого ею значения. Синтаксис вызова функции:
имя_функции(список_аргументов)
Здесь список_дргументов - разделенный запятыми список аргументов аргумент_1, аргумент_2, аргумент_послецний
Функции для работы со строкамиДля объявления и инициализации строк С не требуется никакой директивы include или using. Однако при обработке строк вы наверняка будете применять те или иные предопределенные функции из библиотеки cstring. Поэтому, решив воспользоваться строками С, лучше сразу включите в начало файла программы директиву
#include <cstring>
В таблице 5 приведены некоторые стандартные функции для работы со строками С из библиотеки cstring. В функцияхsatr – строка, s – строковая переменная, n - целое число.
Таблице 5.
Функция | Описание |
strcpy(satr, s) | Копирует строковое значение, заданное в аргументе satr в строковую переменную s |
strncpy(satr, s,n) | Похожа на strcpy, но копирует максимум nсимволов |
strcat(satr, s) | Выполняет конкатенацию строк, добавляя значение satr в конец строки, хранящейся в переменной s |
strncat(satr, s,n) | Похожа на strcat, но добавляет максимум nсимволов |
strlen(satr) | Возвращает целое число, равное длине строки satr, (Нуль-символ '\0' не учитывается.) |
strcmp(satr1,satr2) | Возвращает 0, если satr1 и satr2 одинаковы. Возвращает отрицательное значение, если satr1 меньше, чем satr2, положительное значение, если satr1больше, чем satr2. При сравнениииспользуетсялексикографическийпорядок строк |
strcnmp(satr1,satr2,n) | Похожа на strcmpно добавляет максимум nсимволов |
strstr(satr1,satr2) | Возвращает указатель на первое вхождение заданной подстроки satr2 в строке satr1. |
strchr(satr, ramz) | Возвращает указатель на первое вхождение заданного символа ramzв строке satr1. |
strrchr(satr1, ramz) | Возвращает указатель на последное вхождение заданного символа ramzв строке satr1. |
Кроме того, имеется ряд функций для обработки символов (Таблица 6.)
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |


