Форум программистов, компьютерный форум CyberForum.ru

Функция редактирования строк - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Опишите класс "Вектор" http://www.cyberforum.ru/cpp-beginners/thread644494.html
1. Опишите класс "Вектор". Данные класса: координаты начала и конца вектора. Методы класса: должны обеспечить минимальную функциональность объекта. 2.Перегрузите операцию сложения векторов с использованием операции - метода класса, а операцию вычитания с использованием дружественной ф-ии. 3.Перегрузите унарную операцию ++ для инкремента вектора как метод класса, а-- как дружественную...
C++ Конвертирование в wstring& Всем привет! Не могу понять почему невозможно конвертировать из wchar_t в wstring& Вызов метода client -> CompareTwoString( iteratorclient -> nameclient, positionclient ,lenghtname ); функция bool CompareTwoString( wstring &one, wstring &two, int position ) { //something http://www.cyberforum.ru/cpp-beginners/thread644486.html
C++ В строке с найти количество слов не содержащий подстроку
В строке с найти количество слов не содержащий подстроку с2 вывести эти слова где с2=аб
Матрицы: поменять местами первую строку и строку, содержащую максимальный элемент C++
1)В матрице поменять местами 1 строку и строку содержащие последнее вхождение элемента максимального где максимальный- максимальный элем всей матрицъ вывести итоговую матрицу. 2)В матрице обнулить Все строки содержащие элемент мин более одного раза мин минимальный элемент всей матрицы вывести итоговую матрицу
C++ Двузначное число разделить на две позиции в массиве http://www.cyberforum.ru/cpp-beginners/thread644396.html
у меня есть действительные числа в массиве от 1 до 15. Как сделать так что бы начиная с 10, десять стояла не на одной позиции, а разделилось на две, то есть что бы 10 делилась на 1 и на 0, что бы на 9 позиции стоит 1, а на 10 стоит 0.
C++ Структуры Описать тип TРolygon — запись с полями целого типа, для указания количества сторон и вещественного типа для обозначения длины сторон и описать функцию AreaN(TРolygon) вещественного типа, находящую площадь выпуклого N-угольника. С помощью этой функции найти площади трех многоугольников, если дано число и длины их сторон. Помогите пожалуйста подробнее

Показать сообщение отдельно
cmath
Модератор
 Аватар для cmath
2419 / 1638 / 132
Регистрация: 11.08.2012
Сообщений: 3,258
Завершенные тесты: 5
30.08.2012, 18:12  [ТС]     Функция редактирования строк
Цитата Сообщение от Catstail Посмотреть сообщение
Выложите полный код - я потестирую.
Пожалуйста
(только он претерпел некоторые изменения в теле main() я программу пишу для отработки придуманного алгоритма (чтобы применить его в другом проекте очень для меня важном (мое практическое задание))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include <windows.h>
#include <cstring>
#include <iostream>
 
using namespace std;
// прототип "стерки"
void Erase(char**, int, int);
// проверяет, является ли строка десятичным числом
bool isNumeral(char *str)
{
    int i = 0;
    bool poi = false;
 
    if(str[0]=='.')return false;
 
    while( str[i] != '\0')
    {
        if(str[i] == '.' && poi)return false;
        if(!(isdigit(str[i]) || str[i] == '.'))
        {
            return false;
        }
 
        if(str[i] == '.' && !poi)poi = true;
        i++;
    }
 
    return true;
}
 
 
// проверяет все ли '(' имеют пару ')' и, сообственно, наоборот
bool CheckPunct(char *str)
{
    int  counter1 = 0,
         counter2 = 0;
    int  i = 0;
    while(str[i] != '\0')
    {
        if(str[i] == '(')counter1++;
        if(str[i] == ')')counter2++;
        i++;
    }
    if(counter1 != counter2)return false;
    else return true;
}
 
// ищет операнды в строке, т.е. элементарные математические функции
int FindOperand(char *str, char *op)
{
    char* spec;
    spec = str;
    char* pos, *pCounter;
    int counter = 0;
    int count = 0;
    int len = strlen(op);
    pos = strstr(spec, op);
    while(pos != NULL)
    {
        pCounter = spec;
        while(pCounter != pos)
        {
            pCounter++;
            counter++;
        }
        Erase(&spec, counter, len);
        pos = strstr(spec, op);
        count++;
        counter -= counter;
    }
    return count;
}
// вставляет в строку 1 строку 2 после символа с номером pos
// ничего не делает, если pos больше числа символов в строке
void Insert(char **str1, char **str2, int pos)
{
    char *newstr1, *newstr2, *newstr3;
    int len1, len2;
    int i = 0,
        j = 0,
        k = 0;
    len1 = strlen(*str1);
    len2 = strlen(*str2);
    newstr2 = *str1;
    newstr3 = *str2;
    if(pos <= len1)
    {
        newstr1 = new char[len1 + len2];
        while(i != pos)
        {
            newstr1[i] = newstr2[i];
            i++;
            k++;
        }
        while(j != len2)
        {
            newstr1[i] = newstr3[j];
            i++;
            j++;
        }
        while(i != len1 + len2)
        {
            newstr1[i] = newstr2[k];
            i++;
            k++;
            if(i == len1 + len2)newstr1[i] = '\0';
        }
        delete []newstr2;
        *str1 = newstr1;
    }
}
 
// удаляет из строки n символов, идущих после символа с номером pos
// ничего не делает, если pos + n больше числа символов в строке 
void Erase(char **str, int pos, int n)
{
    char *newstr1, *newstr2;
    newstr2 = *str;
    int i = 0, len;
    len = strlen(newstr2);
    if (len >= pos + n)
    {
        newstr1 = new char[len - n];
        while(i != pos)
        {
            newstr1[i] = newstr2[i];
            i++;
        }
        while(i != len - n)
        {
            newstr1[i] = newstr2[i+n];
            i++;
            if(i == len - n)newstr1[i] = '\0';
        }
        delete []newstr2;
        *str = newstr1;     
    }
}
 
 
// копирует n символов из строки после символа с индексом pos
char* Copy(char *str, int pos, int n)
{
    char *newstr;
    if((int)strlen(str) >= pos + n)
    {
        int i = 0;
        newstr = new char[n];
        while(i < n)
        {
            newstr[i] = str[i + pos];
            i++;
            if(i == n)newstr[i] = '\0';
        }
        return newstr;
    }
    else return NULL;
}
 
int main()
{
    char *str;
    int pos, n;
    str = new char[50];
    cin >> str;
    cout << FindOperand(str, "sin(") << endl;
    system("pause");
    return 0;
};
Добавлено через 53 минуты
Ух... Избавился от ошибки другим способом: превратил процедуру в функцию, возвращающую значение, отпала необходимость в delete и выделении доп. памяти под всякие newstr.

Добавлено через 1 минуту
Ошибка была, похоже таки в delete. Хотя я не понял, чего это один раз она строку почистить-то могла?
 
Текущее время: 06:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru