Составить программу, содержащую стандартный набор функций обработки строк (аналоги си-функций). Программу необходимо реализовать без использования си-функций.
Интерфейс создаваемых функций:
Определение длинны строки, функция должна возвращать количество символов входной строки.
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
Arthur
Владимир Шумов
Андрей Ратушный
Вот мой вариант
#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
Arthur
В функции occurenceSubstring — переменная int level зачем?
Функция occurenceSubstring неверно работает если, например: строка StrSabSub, подстрока Sub, возвращает 4,
то есть функция сравнивает только первый и последний элемент, и длину подстроки, с элементами строки.