Составить программу, содержащую стандартный набор функций обработки строк (аналоги си-функций). Программу необходимо реализовать без использования си-функций.
Интерфейс создаваемых функций:
Определение длинны строки, функция должна возвращать количество символов входной строки.
int lengthString(char *); // прототип функции определения длинны строки
Функция переворачивает строку и возвращает указатель на перевёрнутую строку, пример:
входная строка: С++
выходная строка: ++С
char *reverseString(char *); // прототип функции для переворота (инверсии) строки
Функция для проверки баланса скобок, то есть количество открытых скобок должно совпадать с количеством закрытых, причём необходимо отличать тип скобочек — круглые, квадратные, фигурные. Функция возвращает значение типа int, если 0 — баланс скобок нарушен, если 1 — баланс скобок выдержан, если -1 скобок во входной строке нет.
int balanceBrackets(char *); // прототип функции проверки баланса парных скобок
Функция должна возвращать номер позиции. начиная с которой подстрока входит в строку.
int occurenceSubstring(char *, char *); // прототип функции поиска первого вхождения подстроки в строку, функция должна возвращать позицию первого вхождения подстроки
Функция конкатенации строк, но конкатенация выполняется начиная с n-й позиции так, что вторая строка вставляется в первую строку не удалив ни одного из символов первой строки. Возвращаемое значение — строка, полученная после вставки второй в первую строки. Пример:
входные данные: строка 1 — cpp.com, строка 2 — studio, номер позиции = 4
результат = cppstudio.com
char *insertnString (char *, char *, int); // прототип функции вставки строки во вторую строку с указанной позиции
Функция должна скопировать часть входной строки (k символов), начиная с позиции с номером N.
char *сutString(char *, int, int); // прототип функции извлечения k символов входной строки, начиная с позиции N
Программа написана на языке программирования С++ в среде разработки программ MVS.
// reinvent_wheel.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <iostream>
using namespace std;
int lengthString(char *); // прототип функции определения длинны строки
char *reverseString(char *); // прототип функции для переворота строки
int balanceBrackets(char *); // прототип функции баланс парных скобок
int occurenceSubstring(char *, char *); // прототип функции поиска первого вхождения подстроки в строку
char *insertnString (char *, char *, int); // прототип функции вставки строки во вторую строку с указанной позиции
char *сutString(char *, int, int); // прототип функции извлечения k символов входной строки, начиная с позиции N
int main(int argc, char* argv[])
{
char string[100]; // входная строка
setlocale(LC_ALL, "rus");
cout << "Введите строку для определения её длинны: ";
cin >> string;
cout << "Длинна строки = " << lengthString (string) << endl; // определяем длину входной строки
cout << "\nВведите строку, которую необходимо инвертировать: ";
cin >> string;
cout << "Конвертированная строка = " << reverseString(string) << endl; // выполняем конверт строки
int bal; // баланс скобок
cout << "\nВведите строку для проверки баланса скобок: ";
cin >> string;
bal = balanceBrackets(string); // проверка баланса скобок
if ( bal == -1)
cout << "Во входной строке скобок нет" << endl;
else
if (bal)
cout << "Баланс скобок выдержан" << endl;
else
cout << "Баланс скобок нарушен" << endl;
char substring[100]; // подстрока
cout << "\nВведите строку для получения позиции подстроки: ";
cin >> string;
cout << "Введите подстроку: ";
cin >> substring;
cout << "Номер позиции = " << occurenceSubstring(string, substring) << endl; // получаем позицию первого вхождения подстроки в строку
int n; // позиция вставляемой строки
cout << "\nВведите первую строку для конкатенации: ";
cin >> string;
cout << "Введите вторую строку для конкатенации: ";
cin >> substring;
cout << "Введите позицию для вставляемой строки: ";
cin >> n;
cout << "Результат объединения = " << insertnString (string, substring, n) << endl; // конкатенация строк
int k; // длинна копируемой строки
cout << "\nВведите строку из которой необходимо скопировать n символов: ";
cin >> string;
cout << "Введите длину копируемой строки: ";
cin >> k;
cout << "Введите номер позиции, начиная с которой необходимо скопировать строку: ";
cin >> n;
cout << "Скопированная строка = " << сutString(string, k, n) << endl; // копируем строку
system("pause");
return 0;
}
int lengthString(char *string) // длинна строки
{
int index = 0; // индекс символа в строке
while (string[index] != '\0') // пока не конец строки
{
index++; // считаем количество символов в строке
}
return index;
}
char *reverseString(char *string) // конверт строки
{
int length = lengthString (string); // находим длину строки
char temp; // временная переменная для хранения переставляемого символа
for (int counter = 0; counter < (length / 2); counter++)
{
if (counter != (length - 1 - counter))
{
temp = string[length - 1 - counter]; // символ с конца строки сохраняем во временную переменную
string[length - 1 - counter] = string[counter];
string[counter] = temp;
}
}
return string; // возвращаем указатель на строку
}
int balanceBrackets(char *string) // баланс скобок в строке
{
int return_value = 0; // баланс скобок, если 0 - баланс скобок нарушен, если 1 - баланс скобок выдержан, если -1 скобок нет
int counterParenthesisOpen = 0, // количество вхождений круглых открывающихся скобок
counterParenthesisClose = 0, // количество вхождений круглых закрывающихся скобок
counterBracketOpen = 0, // количество вхождений квадратных открывающихся скобок
counterBracketClose = 0, // количество вхождений квадратных закрывающихся скобок
counterBraceOpen = 0, // количество вхождений фигурных открывающихся скобок
counterBraceClose = 0; // количество вхождений фигурных закрывающихся скобок
int index = 0; // индекс символа в строке
bool exit = false;
while (string[index] != '\0' && !exit) // пока не конец строки
{
switch (string[index]) // считаем скобки
{
case '(':
{
counterParenthesisOpen++; // инкремент количества октрывающихся круглых скобок
break;
}
case ')':
{
counterParenthesisClose++; // инкремент количества закрывающихся круглых скобок
if (counterParenthesisClose > counterParenthesisOpen) exit = true; // выход из цикла
break;
}
case '[':
{
counterBracketOpen++; // инкремент количества октрывающихся квадратных скобок
break;
}
case ']':
{
counterBracketClose++; // инкремент количества закрывающихся квадратных скобок
if (counterBracketClose > counterBracketOpen) exit = true; // выход из цикла
break;
}
case '{':
{
counterBraceOpen++; // инкремент количества октрывающихся фигурных скобок
break;
}
case '}':
{
counterBraceClose++; // инкремент количества закрывающихся фигурных скобок
if (counterBraceClose > counterBraceOpen) exit = true; // выход из цикла
break;
}
}
index++;
}
// выполняем проверку баланса скобок
if (counterParenthesisOpen == 0 && counterParenthesisClose == 0 && counterBracketOpen == 0 &&
counterBracketClose == 0 && counterBraceOpen == 0 && counterBraceClose == 0) return_value = -1; // во входной строке нет скобок
else
if (counterParenthesisOpen == counterParenthesisClose && counterBracketOpen == counterBracketClose
&& counterBraceOpen == counterBraceClose ) return_value = 1; // баланс скобок не нарушен
return return_value;
}
int occurenceSubstring(char *string, char * substring)
{
int index1 = 0, // индекс символа в строке string
index2 = 0; // индекс символа в строке substring
int return_index = -1; // индекс первого вхождения подстроки
bool in = true; // булевская переменная-флаг, определяет однократное вхождение в тело оператора выбора if
while (string[index1] != '\0')
{
if (string[index1] == substring[index2])
{
if (in) {return_index = index1 + 1; in = false;}
index2++;
}
else
{
if ((index2 ) != lengthString(substring))
{
return_index = -1;
index2 = 0;
in = true;
}
}
index1++;
}
return return_index;
}
char *insertnString (char *string1, char * string2, int n) // функция вставки строки во вторую строку с указанной позиции
{
n-=1; // уменьшаем номер позиции на 1, так как нумерация элементов массива начинается с 0
static char temp_string[200]; // строка для хранения объединённых входных строк
// записываем в новую строку n символов первой строки
for (int counter = 0; counter < n; counter++)
temp_string[counter] = string1[counter];
int index_str2 = 0, // индекс символов второй строки
current_index = n; // индекс символов новой строки
// в цикле объединяем вторую строку с первыми n символами первой строки
while (string2[index_str2] != '\0')
{
temp_string[current_index] = string2[index_str2];
current_index++;
index_str2++;
}
int index_str1 = n; // индекс символов первой строки
// в цикле оставшиеся символы первой строки добавляем в конец новой строки
while (string1[index_str1] != '\0')
{
temp_string[current_index] = string1[index_str1];
index_str1++;
current_index++;
}
return temp_string;
}
char *сutString(char *string, int k, int n) // функция извлечения k символов входной строки, начиная с позиции N
{
static char returnString[100]; // извлекаемая часть строки
int index = 0; // текущий индекс в возвращаемой строке
for (int counter = n - 1; counter < (n - 1 + k) ; counter++)
{
returnString[index] = string[counter];
index++;
}
return returnString;
}
Результат работы программы показан на рисунке 1.
Введите строку для определения её длинны: cppstudio.com Длинна строки = 13 Введите строку, которую необходимо инвертировать: cppstudio.com Конвертированная строка = moc.oidutsppc Введите строку для проверки баланса скобок: (5+(4+a[2])+b[1]*(3-2)) Баланс скобок выдержан Введите строку для получения позиции подстроки: cppstudio.com Введите подстроку: studio Номер позиции = 4 Введите первую строку для конкатенации: cpp.com Введите вторую строку для конкатенации: studio Введите позицию для вставляемой строки: 4 Результат объединения = cppstudio.com Введите строку из которой необходимо скопировать n символов: cppstudio.com Введите длину копируемой строки: 6 Введите номер позиции, начиная с которой необходимо скопировать строку: 4 Скопированная строка = studio
Комментарии
Arthur
#include<iostream> #include<stdio.h.> #include<conio.h> // для getche() using namespace std; const int MAX = 1000; int lengthString(char*); char *reverseString(char *); int balanceBrackets(char *); int occurenceSubstring(char *, char *); char *insertnString (char *, char *, int); char *cutString(char *, int, int); int strncmp(char* , char* , int ); int main() { setlocale(LC_CTYPE, "rus"); char *stroka1 = new char[MAX]; char *stroka2 = new char[MAX]; char menu; while(true) { cout<<"Выберите действие:" <<"\n1 - для определения длины строки" <<"\n2 - для инверсии(переворота) стороки" <<"\n3 - для проверки баланса скобок в строке" <<"\n4 - для поиска первого вхождения подстроки в строку" <<"\n5 - для вставки строки во вторую строку с указанной позиции" <<"\n6 - для извлечения k символов входной строки, начиная с позиции N" <<"\n0 - выход" <<"\nВаш выбор: "; while(true) { menu = getch(); if(menu>='0' && menu<='9') { cout<<menu; while(getch() != '\r'); break; } } switch(menu) { case '1': { cout<<"\nВведите строку для определения её длины: "; cin.getline(stroka1, MAX); cout<<"Длина строки: "<<lengthString(stroka1)<<endl; break; } case '2': { cout<<"\nВведите строку которую надо инвертировать: "; cin.getline(stroka1, MAX); cout<<"Конвертированная строка: " <<reverseString(stroka1)<<endl; break; } case '3': { cout<<"\nВведите строку для проверки баланса скобок: "; cin.getline(stroka1, MAX); switch(balanceBrackets(stroka1)) { case 1: cout<<"Баланс скобок не выдержан"<<endl; break; case 0: cout<<"Баланс скобок выдержан"<<endl; break; case -1: cout<<"Нет скобок в строке"<<endl; } break; } case '4': { cout<<"\nВведите строку для получения позиции подстроки: "; cin.getline(stroka1, MAX); cout<<"Введите подстроку: "; cin.getline(stroka2, MAX); if(occurenceSubstring(stroka1, stroka2)==0) cout<<"В строке нет такой подстроки"<<endl; else cout<<"Номер позиции: "<<occurenceSubstring(stroka1, stroka2)<<endl; break; } case '5': { int pozic; cout<<"\nВведите первую строку для конкатенации: "; cin.getline(stroka1, MAX); cout<<"Введите вторую строку для конкатенации: "; cin.getline(stroka2, MAX); while(true) { cout<<"Введите позицию для вставляемой строки"<<"(1 - "<<lengthString(stroka1) + 1<<"): "; cin>>pozic; if(cin.good() && pozic>0 && pozic<= (lengthString(stroka1) + 1) ) { cin.ignore(MAX, '\n'); break; } cin.clear(); cout<<"\nНеправильный ввод данных\n"; cin.ignore(MAX, '\n'); } cout<<"Результат объединения: "; cout<<insertnString (stroka1, stroka2, pozic)<<endl; break; } case '6': { int n, k; cout<<"\nВведите строку из которой необходимо скопировать n символов: "; cin.getline(stroka1, MAX); while(true) { cout<<"Введите длину копируемой строки"<<"(1 - "<<lengthString(stroka1)<<"): "; cin>>k; if(cin.good() && k>0 && k<= (lengthString(stroka1) + 1) ) { cin.ignore(MAX, '\n'); break; } cin.clear(); cout<<"\nНеправильный ввод данных\n"; cin.ignore(MAX, '\n'); } while(true) { cout<<"Введите номер позиции с которой необходимо скопировать строку"<<"(1 - "<<lengthString(stroka1)<<"): "; cin>>n; if(cin.good() && n>0 && n<= (lengthString(stroka1) + 1) ) { cin.ignore(MAX, '\n'); break; } cin.clear(); cout<<"\nНеправильный ввод данных\n"; cin.ignore(MAX, '\n'); } cout<<"Скопированная строка: " <<cutString(stroka1, k, n)<<endl; break; } case '0': return 0; default: cout<<"\nНедопустимый ввод!"<<endl; } } return 0; } ////////////////////////////////////////////////////////////////////// int lengthString(char *stroka) { int i; for( i = 0; stroka[i] != 0; i++); return i; } /////////////////////////////////////////////////////////////////// char *reverseString(char *stroka) { char temp; int lens = lengthString(stroka); //найти длину строки for(int x=0; x<lens/2; x++) { temp = stroka[x]; // поменять символы из первой половины строки stroka[x] = stroka[lens-1-x]; //на символы из второй половины stroka[lens-1-x] = temp; } return stroka; } //////////////////////////////////////////////////////////////////////////////// int balanceBrackets(char *stroka) { char stek[100]; //стек для хранения скобок char ch; char lastch; int j = 0; bool flag = 0; for(int i = 0; stroka[i] != 0; i++) { ch = stroka[i]; if(ch == '(' || ch == '{' || ch == '[') { stek[j++] = ch; flag = 1; //если символ открывающая скобка, он заносится в стек } if(ch == ')' || ch == '}' || ch == ']') { flag = 1; if(j == 0) return 1; //если закрывающая скобка есть, а открывающей нет lastch = stek[--j]; //получить последний символ из стека if(lastch == '(' && ch != ')') return 1; //если последний символ открывающай скобка, а текущий символ не закрывающая скобка if(lastch == '{' && ch != '}') return 1; if(lastch == '[' && ch != ']') return 1; } } if(!flag) return -1; //если нет скобок в строке if(j == 0) return 0; else return 1; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int occurenceSubstring(char *stroka, char *podstroka) { int x = 0; if(podstroka[x] != 0) for(int i=0; stroka[i] != 0; i++) //последовательно сравниваем элемент строки с элеметами подстроки { for( x=0; podstroka[x] != 0; x++) if(stroka[i + x] != podstroka[x] ) //если элемент строки совпал с первым элементом подстроки break; //инкреминируем счетчик if(podstroka[x] == 0) //если элементы строки последовательно совпали с элементами подстроки return i+1; } return 0; //альтернативный вариант, используется функция сравнения строк с префиксом /*int i; int n = lengthString(podstroka); for(i = 0; stroka[i] != 0; i++) if(strncmp(stroka + i, podstroka, n) == 0) return i + 1; return 0;*/ } ////////////////////////////////////////////////////////////////////// char *insertnString (char *s1, char *s2, int n) { int l1 = lengthString(s1); int l2 = lengthString(s2); char *rezult_str = new char[l1 + l2 +1]; // строка - сборка +1 для символа конца строки n--; // for(int x = 0; x<n; x++) rezult_str[x] = s1[x]; // копируем часть первой строки до нужного индекса for(int x = 0; x<l2; x++) //добавляем вставляемую строку rezult_str[x + n] = s2[x]; for(int x = n; s1[x] != 0; x++) //добавляем оставшуюся часть первой строки rezult_str[x + l2] = s1[x]; rezult_str[l1 + l2] = ''; return rezult_str; } ///////////////////////////////////////////////////////////////////////////// char *cutString(char *cutsroka1, int lens, int poz) { char *cutstroka2 = new char[lens + 1]; //+1 для символа конца строки int x = 0; int y = poz - 1; for(x; x<lens && cutsroka1[y] != '' ; x++, y++) cutstroka2[x] = cutsroka1[y]; cutstroka2[x] = ''; return cutstroka2; } //////////////////////////////////////////////////////////////////////// int strncmp(char* a, char* b, int n) //для альтернативного варианта occurenceSubstring(...) { int x; for(x = 0; x<n && a[x] != 0; x++ ) if(a[x] != b[x]) return (a[x] - b[x]); return 0; }Arthur
#include<iostream> #include<stdio.h.> #include<conio.h> // для getche() using namespace std; const int MAX = 1000; int lengthString(char*); char *reverseString(char *); int balanceBrackets(char *); int occurenceSubstring(char *, char *); char *insertnString (char *, char *, int); char *cutString(char *, int, int); int strncmp(char* , char* , int ); //для альтернативного варианта occurenceSubstring(...) int main() { setlocale(LC_CTYPE, "rus"); char *stroka1 = new char[MAX]; char *stroka2 = new char[MAX]; char menu; while(true) { cin.sync(); cout<<"Выберите действие:" <<"\n1 - для определения длины строки" <<"\n2 - для инверсии(переворота) стороки" <<"\n3 - для проверки баланса скобок в строке" <<"\n4 - для поиска первого вхождения подстроки в строку" <<"\n5 - для вставки строки во вторую строку с указанной позиции" <<"\n6 - для извлечения k символов входной строки, начиная с позиции N" <<"\n0 - выход" <<"\nВаш выбор: "; while(true) { menu = getch(); if(menu>='0' && menu<='9') { cout<<menu; while(getch() != '\r'); break; } } switch(menu) { case '1': { cout<<"\nВведите строку для определения её длины: "; gets(stroka1); cout<<"Длина строки: "<<lengthString(stroka1)<<endl; break; } case '2': { cout<<"\nВведите строку которую надо инвертировать: "; gets(stroka1); cout<<"Конвертированная строка: " <<reverseString(stroka1)<<endl; break; } case '3': { cout<<"\nВведите строку для проверки баланса скобок: "; gets(stroka1); switch(balanceBrackets(stroka1)) { case 1: cout<<"Баланс скобок не выдержан"<<endl; break; case 0: cout<<"Баланс скобок выдержан"<<endl; break; case -1: cout<<"Нет скобок в строке"<<endl; } break; } case '4': { cout<<"\nВведите строку для получения позиции подстроки: "; gets(stroka1); cout<<"Введите подстроку: "; gets(stroka2); if(occurenceSubstring(stroka1, stroka2)==0) cout<<"В строке нет такой подстроки"<<endl; else cout<<"Номер позиции: "<<occurenceSubstring(stroka1, stroka2)<<endl; break; } case '5': { unsigned int pozic; cout<<"\nВведите первую строку для конкатенации: "; gets(stroka1); cout<<"Введите вторую строку для конкатенации: "; gets(stroka2); while(true) { cout<<"Введите позицию для вставляемой строки"<<"(1 - "<<lengthString(stroka1) + 1<<"): "; cin>>pozic; if(cin.good() && pozic>0 && pozic<= (lengthString(stroka1) + 1) ) { cin.sync(); break; } cin.clear(); cout<<"\nНеправильный ввод данных\n"; cin.sync(); } cout<<"Результат объединения: "; cout<<insertnString (stroka1, stroka2, pozic)<<endl; break; } case '6': { unsigned int n, k; cout<<"\nВведите строку из которой необходимо скопировать n символов: "; gets(stroka1); while(true) { cout<<"Введите длину копируемой строки"<<"(1 - "<<lengthString(stroka1)<<"): "; cin>>k; if(cin.good() && k>0 && k<= lengthString(stroka1) ) { cin.sync(); break; } cin.clear(); cout<<"\nНеправильный ввод данных\n"; cin.sync(); } while(true) { cout<<"Введите номер позиции с которой необходимо скопировать строку"<<"(1 - "<<lengthString(stroka1)<<"): "; cin>>n; if(cin.good() && n>0 && n<= lengthString(stroka1) ) { cin.sync(); break; } cin.clear(); cout<<"\nНеправильный ввод данных\n"; cin.sync(); } cout<<"Скопированная строка: " <<cutString(stroka1, k, n)<<endl; break; } case '0': return 0; default: cout<<"\nНедопустимый ввод!"<<endl; } } return 0; } ////////////////////////////////////////////////////////////////////// int lengthString(char *stroka) { int i; for( i = 0; stroka[i] != 0; i++); return i; } /////////////////////////////////////////////////////////////////// char *reverseString(char *stroka) { char temp; int lens = lengthString(stroka); //найти длину строки for(int x=0; x<lens/2; x++) { temp = stroka[x]; // поменять символы из первой половины строки stroka[x] = stroka[lens-1-x]; //на символы из второй половины stroka[lens-1-x] = temp; } return stroka; } //////////////////////////////////////////////////////////////////////////////// int balanceBrackets(char *stroka) { char stek[100]; //стек для хранения скобок char ch; char lastch; int j = 0; bool flag = 0; for(int i = 0; stroka[i] != 0; i++) { ch = stroka[i]; if(ch == '(' || ch == '{' || ch == '[') { stek[j++] = ch; flag = 1; //если символ открывающая скобка, он заносится в стек } if(ch == ')' || ch == '}' || ch == ']') { flag = 1; if(j == 0) return 1; //если закрывающая скобка есть, а открывающей нет lastch = stek[--j]; //получить последний символ из стека if(lastch == '(' && ch != ')') return 1; //если последний символ открывающай скобка, а текущий символ не закрывающая скобка if(lastch == '{' && ch != '}') return 1; if(lastch == '[' && ch != ']') return 1; } } if(!flag) return -1; //если нет скобок в строке if(j == 0) return 0; else return 1; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int occurenceSubstring(char *stroka, char *podstroka) { int x; for(int i=0; stroka[i] != 0; i++) //последовательно сравниваем элемент строки с элеметами подстроки { for( x=0; podstroka[x] != 0; x++) if(stroka[i + x] != podstroka[x] ) //если элемент строки совпал с первым элементом подстроки break; //инкреминируем счетчик if(podstroka[x] == 0) //если элементы строки последовательно совпали с элементами подстроки return i+1; } return 0; //альтернативный вариант, используется функция сравнения строк с префиксом /*int i; int n = lengthString(podstroka); for(i = 0; stroka[i] != 0; i++) if(strncmp(stroka + i, podstroka, n) == 0) return i + 1; return 0;*/ } ////////////////////////////////////////////////////////////////////// char *insertnString (char *s1, char *s2, int n) { int l1 = lengthString(s1); int l2 = lengthString(s2); char *rezult_str = new char[l1 + l2]; // строка - сборка n--; // for(int x = 0; x<n; x++) rezult_str[x] = s1[x]; // копируем часть первой строки до нужного индекса for(int x = 0; x<l2; x++) //добавляем вставляемую строку rezult_str[x + n] = s2[x]; for(int x = n; s1[x] != 0; x++) //добавляем оставшуюся часть первой строки rezult_str[x + l2] = s1[x]; return rezult_str; } ///////////////////////////////////////////////////////////////////////////// char *cutString(char *cutsroka1, int lens, int poz) { char *cutstroka2 = new char[lens]; for(int x=0; x<lens; x++) cutstroka2[x] = cutsroka1[x+(poz-1)]; return cutstroka2; } //////////////////////////////////////////////////////////////////////// int strncmp(char* a, char* b, int n) //для альтернативного варианта occurenceSubstring(...) { int x; for(x = 0; x<n && a[x] != 0; x++ ) if(a[x] != b[x]) return (a[x] - b[x]); return 0; }Владимир Шумов
#include <conio.h> #include <iostream> using std::cout; using std::cin; using std::endl; int lengthString(char *str) { int numberSymbol = 0; while (str[numberSymbol] != '') { numberSymbol++; } return numberSymbol; } char *reverseStr(char *str) { int length, j = 0; char x; length = lengthString(str); for (int i(0); i < length / 2; i++) { x = str[length - 1 - i]; str[length - 1 - i] = str[i]; str[i] = x; length--; } return str; } int balanceBrackets(char *str) { int parentheses = 0, squareBrackets = 0, braces = 0, result = -1; bool balanceParentheses = true; for (int i(0); i < lengthString(str); i++) { if (str[i] == '(') { parentheses++; balanceParentheses = false; } if (str[i] == ')') { parentheses--; balanceParentheses = false; } if (str[i] == '[') { squareBrackets++; balanceParentheses = false; } if (str[i] == '[') { squareBrackets--; balanceParentheses = false; } if (str[i] == '{') { braces++; balanceParentheses = false; } if (str[i] == '}') { braces--; balanceParentheses = false; } } if (parentheses != 0 || squareBrackets != 0 || braces != 0) { result = 0; } if (balanceParentheses == false && parentheses == 0 && squareBrackets == 0 && braces == 0) { result = 1; } return result; } int occurenceSubstring(char *str2, char *str) { int k = 0, result = 0, n = 0; for (int i(0); i < lengthString(str); i++) { if (str2[n] == str[i]) { k++; n++; } else { k = 0; n = 0; } if (k == lengthString(str2)) { result = i + 2 - k; break; } } return result; } char *insertnString (char *str, char *str2, int x) { static char str3[256]; int n = 0; x--; for (int i(0); i < x + lengthString(str2) + (lengthString(str)-x); i++) { if (i < x) { str3[i] = str[i]; } if (i > x-1 && i < lengthString(str2) + x) { str3[i] = str2[n]; n++; } if (i > lengthString(str2) - 1 + x && i < x + lengthString(str2) + (lengthString(str) - x)) { str3[i] = str[x]; x++; } } return str3; } char *сutString(char *str, int lengthString, int firstSymbol) { static char str2[256]; int x = 0; for (int i(firstSymbol - 1); i < firstSymbol + lengthString - 1; i++) { str2[x] = str[i]; x++; } return str2; } int main() { setlocale(LC_ALL, "Russian"); char str[256], str2[256]; int lengthStr, firstSymbol; cout << "Введите строку для определения её длинны: "; cin.getline(str, 256); cout << "Количество символов: " << lengthString(str)<< endl; cout << endl; cout << "Введите строку, которую необходимо инвертировать: "; cin.getline(str, 256); cout << "Конвертированная строка: " << reverseStr(str); cout << endl << endl; cout << "Введите строку для проверки баланса скобок: "; cin.getline(str, 256); if (balanceBrackets(str) == 1) { cout << "Баланс скобок выдержан." << endl; } if (balanceBrackets(str) == 0) { cout << "Баланс скобок нарушен." << endl; } if (balanceBrackets(str) == -1) { cout << "Скобок во входной строке нет." << endl << endl; } cout << "Введите строку для получения позиции подстроки: "; cin.getline(str, 256); cout << "Введите подстроку: "; cin.getline(str2, 256); cout << occurenceSubstring(str2, str) << endl << endl; cout << "Введите первую строку для конкатенации: "; cin.getline(str, 256); cout << "Введите вторую строку для конкатенации: "; cin.getline(str2, 256); cout << "Введите позицию для вставляемой строки: "; cin >> lengthStr; cout << "Результат объединения: "<< insertnString (str, str2, lengthStr) << endl << endl; cout << "Введите строку из которой необходимо скопировать n символов: "; cin.getline(str, 256); cin.getline(str, 256); cout << "Введите длину копируемой строки: "; cin >> lengthStr; cout << "Введите номер позиции, начиная с которой необходимо скопировать строку: "; cin >> firstSymbol; cout << "Скопированная строка: " << сutString(str, lengthStr, firstSymbol);; _getch(); }Андрей Ратушный
Вот мой вариант
#include <iostream>
using namespace std;
int lenthString(char *String)//Кол-во символов в строке
{
int count = 0;
while (*String)
{
++String;
++count;
}
return count;
}
char *reverseString(char *String)//Строка наоборот
{
int lenth = lenthString(String);
char *tempString=new char[lenth+1];
while (*String)
{
++String;
}
for (int i = 0; i < lenth;++i)
tempString[i]=*—String;
tempString[lenth] = »;
return tempString;
}
int occurenceSubstring(char *String, char *FoundString)//Определение позиции в 1 строке начала второй строки
{
int count = 0, lenthFound = lenthString(FoundString),position,countLast=0;
while (*String)
{
++countLast;
if (*String == *FoundString)
{
if (!count) position = countLast;
++count;
++FoundString;
}
else if (count && count!=lenthFound)
{
while (count)
{
—count;
—FoundString;
}
—String;
—countLast;
}
++String;
}
return position;
}
char *insertnString(char *StringOriginal, char *AddString, int position) //Конкатенация (вставка в 1 строку другой строки по указаной позиции)
{
int lenth = lenthString(StringOriginal) + lenthString(AddString);
char *TempString = new char[lenth + 1];
TempString[0] = NULL;
for (int i = 0; i < lenth; ++i)
{
if (i + 1 != position)
TempString[i] = *StringOriginal++;
else
{
TempString[i] = *AddString++;
++position;
if (!*AddString) position = 0;
}
}
TempString[lenth] = »;
return TempString;
}
char *сutString(char *String, int position, int lenthNewString)// Вырезание строки из заданой (определено колво символов и позицию откуда вырезать)
{
char *TempString = new char[lenthNewString + 1];
int count = 0;
for (int i = 0;1; ++i)
{
if (i + 1 == position)
{
++position;
TempString[count] = String[i];
++count;
if (count == lenthNewString) break;
}
}
TempString[lenthNewString] = »;
return TempString;
}
void main()
{
char *String=nullptr;
String = «cppstudio.com»;
char *FoundString = nullptr;
FoundString = «studio»;
char *StringOriginal = nullptr;
StringOriginal = «cpp.com»;
//cout << lengthString(String);
//cout << reverseString(String);
//cout << occurenceSubstring(String, FoundString);
//cout << insertnString(StringOriginal, FoundString,4);
//cout << сutString(String, 4, 6);
}
Adam1983
#include <conio.h> #include <iostream> using namespace std; int lengthString(char* ); char* reverseString(char* ); int balanceBrackets(char* ); int occurenceSubstring(char *, char *); char* insertnString (char *, char *, int); char* сutString(char*, int, int); int main(int argc, char** argv) { setlocale (LC_ALL, "russian"); //выдиление динамической памяти и ввод строки char* str = new char[255]; cout << "Введите строку: "; cin.getline(str,255); //вызов функции с определением длинны строки cout <<"Длинна строки: "<< lengthString(str)<< endl; //выводим строку с приминением функции реверса и возвращаем её в первоначальное состояние cout << reverseString(str) << endl; reverseString(str); // вывод результата работы функции проверки скобок в понятное состояние для пользователя if (balanceBrackets(str)==1) { cout << "Баланс скобок выдержан" << endl; } else if (balanceBrackets(str)==0) cout << "Баланс скобок нарушен" << endl; else cout << "Скобок в строке нет" << endl; // выдиляем динамическую память для подстроки и ввод подстроки с последующим применением функции // вставки подстроки в основную строку char* str1 = new char[255]; cout << "Введите подстроку: "; cin.getline(str1,255); cout << "Номер позиции: " << occurenceSubstring(str,str1) << endl; cout << "Введите Н: "; int n; cin >> n; // выдиляем динамическую память под строку, для копирования в неё результата //функции insertnString и выводим рузулдьтат на экран char* str2 = new char[255]; str2=insertnString (str,str1,n); for (int i(0); i<(lengthString(str)+lengthString(str1)); i++) cout <<str2[i]; int length, position; cout << "\nВведите длинну копируемой строки: "; cin >> length; cout << "Введите номер позиции, начиная с которой необходимо скопировать строку: "; cin >> position; // выдиляем динамическую память под строку, для копирования в неё результата //функции сutString и выводим рузулдьтат на экран char* str3 = new char[length]; str3=сutString(str,length,position); for (int i(0); i<length; i++) cout <<str3[i]; // освобождаем память delete [] str; delete [] str1; delete [] str2; delete [] str3; _getch(); return 0; } int lengthString(char* str) //функция для определения длинны строки { //устанавливаем счётчик и возвращаем его значение int counter(0); for(int i(0); str[i]; i++) { counter++; } return counter; } char* reverseString(char* str)//функция для реверса строки { //выдиляем память под новую строку, для копирования в неё результата реверса int temp = lengthString(str)+1; char* str1= new char[temp]; for (int i(0), j(temp-1); i<temp; i++, j--) { str1[i]=str[j]; } for (int i(1); i<temp; i++) { str[i-1]= str1[i]; } delete [] str1; return str; } int balanceBrackets(char* str)// функция для проверки баланса скобок { int temp = lengthString(str)+1; int left(0); int right(0); // подсчитываем коллдичество левых и правых скобок и записываем значения // в переменные for (int i(0); i<temp; i++) { if (str[i]=='[' || str[i]=='{' || str[i]=='(') left++; if (str[i]==']' || str[i]=='}' || str[i]==')') right++; } //сравниваем значения переменных и в зависимости от этого возвращаем результат if(left==0 && right==0) return -1; if(left==right) return 1; else return 0; } int occurenceSubstring(char* str, char* str1) //функция поиска первого вхождения подстроки в строку { int temp = lengthString(str); int temp1 = lengthString(str1); int level(0); for(int i(0); i<temp ; i++) { if(str[i]==str1[0] && str[i+temp1-1] == str1[temp1-1]) { return i+1; } } } char* insertnString (char* str, char* str1, int n)//функция вставки подстроки в строку { int temp = lengthString(str); int temp1 = lengthString(str1); //выдиляем динамическую память для записи в неё результата обьединения строк // и копируем в неё участки первой строки и подстроку в нужной посделовательности char* str2 = new char[temp+temp1]; for (int i(0); i<(n-1); i++) { str2[i] = str[i]; } for (int i(n-1), j(0); j<(temp1+n-1); i++, j++) { str2[i] = str1[j]; } for (int i(temp1+n-1), j(n-1); i<(temp+temp1); i++, j++) { str2[i] = str[j]; } //копируем результат в первую строку, так как нужно освободить память для выделенной // временной строки str = new char [temp+temp1]; for (int i(0); i<(temp+temp1); i++) { str[i]=str2[i]; } delete [] str2; return str; } char* сutString(char* str, int length, int position)//функция извлечения k(length) символов входной строки { //выдиляем динамическую память для временной строки и копируем в неё необходимы отрезок основной строки char* temp = new char[length]; for (int i(position-1), j(0); i<(length+position-1);i++, j++) { temp[j]=str[i]; } //копируем результат в первую строку, так как нужно освободить память для выделенной // временной строки str = new char [length]; for (int i(0); i<length; i++) { str[i]=temp[i]; } delete [] temp; return str; }Arthur
В функции occurenceSubstring — переменная int level зачем?
Функция occurenceSubstring неверно работает если, например: строка StrSabSub, подстрока Sub, возвращает 4,
то есть функция сравнивает только первый и последний элемент, и длину подстроки, с элементами строки.