1

Тема: літерні рядки

#include <string>
#include <iostream>
using namespace std;
int Count(char* str)
{
    if (strlen(str)<2)
        return 0;
    int k = 1;
    for (int i = 1; str[i] != 0; i++)
        if ((str[i] == 'B')||(str[i] == 'A')||(str[i] == 'S')||(str[i] == 'I')||(str[i] == 'C'))

            k++;
    return k;
}
char* Change(char* str)
{
    if (strlen(str)<4)
        return str;
    char* tmp = new char[strlen(str) * 4 / 2 + 1];
    char* t = tmp;
    tmp[0] = '\0';
    int i = 0;
    while (str[i+1] != 0)
    {
        
            if ((str[i] == 'B')||(str[i+1] == 'A')||(str[i+2] == 'S')||(str[i+3] == 'I')||(str[i+4] == 'C'))
            //{ ((str[i]='D')||(str[i+1] == 'E')||(str[i+2] == 'L')||(str[i+3] == 'P')||(str[i+4] == 'H')||(str[i+4] == 'I'));
            {    strcat(t, "DELPHI");
                t += 6;
                i += 5;
            }
            else
            {
                *t++ = str[i++];
                *t = '\0';
            }
    }
    *t++ = str[i++];
    *t++ = str[i++];
    *t = '\0';
    strcpy(str, tmp);
    return tmp;
}
int main()
{
    char str[101];
    cout << "Enter string:" << endl;
    cin.getline(str, 100);
    cout << "String contained " << Count(str) << " Bs As Ss Is AND Cs" << endl;
    char* dest = new char[151];
    dest = Change(str);
    cout << "Modified string (param) : " << str << endl;
    cout << "Modified string (result): " << dest << endl;
    cout<< endl;
    system("pause");
    return 1;
}

Отака прога. Вибиває помилку.

здається похибка тут: char* tmp = new char[strlen(str) * 4 / 2 + 1];
чи правильне тут відношення?
ну усе наче гаразд, але після правильного опрацювання вибиває помилку.

2

Re: літерні рядки

тут кінець стрічки може (і шивидше за все) виявиться не там де ти хотів би.

while (str[i+1] != 0)
{
...
i += 5;
...
}

Хіба важко усно поділити 4/2? нащо компілятор мучити. тай погано ясно нащо це

char* tmp = new char[strlen(str) * 4 / 2 + 1];

Код, між іншим, жахливий, і пам’ять тече.
Поясни детальніше, що має робити ця штука

3

Re: літерні рядки

1. Похибка = відхилення. Тут похибки немає.
2. Помилки в цьому рядку немає, вона ще десь. Хоча можливо, що задля виправлення помилки ще десь треба виправити цей рядок.
3. Мої телепатичні здібності підказують, що ще мало бути питання "як виправити програму, щоб не вибивало помилку". Якщо я правий, то видаліть все, крім

Прихований текст
int main()
{
}

і помилку не вибиватиме. На більше моєї телепатії не вистачає.

4

Re: літерні рядки

@regosso, по коду можна висунути лише загальні зауваження: щодо того, як саме вона не працює, - до Глоби давайте пояснення суті проблеми: "прога ма робити таке, я даю їй оце, вона видає оце, і так негарно".

загал

1. Перед перевірками на strlen() варто би перевіряти на нуль: мало яке сміття потрапить до функції.
2. Ви принципово хочете закочувати Сонце вручну велосипедити пошук підрядка у рядку, чи на строкові функції перейдете? ;)
3. Функцію Change() витерти, потім помити руки з милом - і написати заново.