1

Тема: допоможіть(С++(стрічки))

ось повне завдання

Прихований текст
Створити наступні функції:
int mystrlen (const char * str); - Функція визначає довжину стрічки.
char * mystrcpy (char * str1, const char * str2); - Функція копіює всі символи з стрічки str2 в стрічку str1. Функція повертає вказівник на першу стрічку str1.
char * mystrcat (char * str1, const char * str2); - Функція приєднує стрічку str2 до стрічки str1. Функція повертає вказівник на першу стрічку str1.
char * mystrchr (char * str, char s); - Функція здійснює пошук символу s в стрічці str. Функція повертає вказівник на перше входження символу в стрічку, в іншому випадку 0.
char * mystrstr (char * str1, char * str2); - Функція здійснює пошук підстрічки str2 в стрічці str1. Функція повертає вказівник на перше входження підстрічки str2 в стрічку str1, в іншому випадку 0.
char * mystrrev (char * str); - Функція реверсує стрічку і повертає вказівник на нову стрічку.

ось завдання яке зараз виконую

Прихований текст
char * mystrstr (char * str1, char * str2); - Функція здійснює пошук підстрічки str2 в стрічці str1. Функція повертає вказівник на перше входження підстрічки str2 в стрічку str1, в іншому випадку 0.

ось весь код

Прихований текст

#include <iostream>
#include <conio.h>
using namespace std;
int mystrlen(const char*str);
char*mystrcpy(char*str1, const char*str2);
char*mystrcat(char*str1, const char*str2);
char*mystrchr(char*str, char s);
char*mystrstr(char*str1, char*str2);
void main() {
    char s = 0;
    setlocale(LC_ALL, "ru");
    const int a = 100;
    char str1[a];
    cout << "Введiть стрiчку : ";
    gets_s(str1);
    int n = mystrlen(str1);
    cout << n << "\n";
    char str2[a];
    cout << "Введiть стрiчку : ";
    gets_s(str2);
    char* aaa = mystrcpy(str1, str2);
    cout << str1 << "\n" << str2 << "\n";
    char* aaaa = mystrcat(str1, str2);
    cout << str1 << "\n";
    cout << "Введiть символ : ";
    cin >> s;
    char *aaaaa = mystrchr(str1, s);
    puts(aaaaa);
    char str3[a];
    cout << "Введiть стрiчку : ";
    gets_s(str3);
    char* bb = mystrstr(str1, str3);
    puts(bb);
    system("pause");
}
char*mystrstr(char*str1, char*str3) {
    int a = 0, index = 0;
    int n = mystrlen(str1);
    for (int j = 0; j < n; j++) {
        for (int i = 0; str1[i] != 0; i++) {
            if (str1[i] == str3[i]) {
                a++;
                index = i;
            }
            a = 0;
            if (a == n) {
                return &str1[index - n];
            }
        }
    }
    for (int i = 0; str1[i] != 0; i++) {
        str1[i] = '0';
    }
    return str1;
}
char *mystrchr(char*str1, char s) {
    for (int i = 0; str1[i] != 0; i++) {
        if (str1[i] == s) {
            return &str1[i];
        }
    }
    for (int i = 0; str1[i] != 0; i++) {
        str1[i] = '0';
    }
    return str1;
}
char*mystrcat(char*str1, const char*str2) {
    int num = 0;
    const int a = 100;
    char str[a];
    for (int i = 0; str1[i] != 0; i++) {
        str[i] = str1[i];
        num++;
    }
    str[num] = '\0';
    int nam = mystrlen(str);
    num = 0;
    for (int i = 0; i < a; i++) {
        if (str1[i] == '\0') {
            str1[i] = ' ';
        }
    }
    int ii = 0;
    for (int i = 0; i < a + a, str2[ii] != 0; i++) {
        if (i < nam) {
            str1[i] = str[i];
            num++;
        }
        if (i > nam) {
            str1[i] = str2[ii];
            ii++;
            num++;
        }
    }
    str1[num] = '\0';
    return str;
}
char*mystrcpy(char*str1, const char*str2) {
    int num = 0;
    const int a = 100;
    char str[a];
    for (int i = 0; str1[i] != 0; i++) {
        str[i] = str1[i];
        num++;
    }
    str[num] = '\0';
    num = 0;
    for (int i = 0; i < a; i++) {
        if (str1[i] == '\0') {
            str1[i] = ' ';
        }
    }
    for (int i = 0; str1[i] != 0; i++) {
        str1[i] = str2[i];
        num++;
    }
    return str;
}
int mystrlen(const char*str) {
    int num = 0;
    for (int i = 0; str[i] != 0; i++) {
        if (str[i] != 0) {
            num++;
        }
    }
    return num;
}

ось код завдання

Прихований текст

char*mystrstr(char*str1, char*str3) {
    int a = 0, index = 0;
    int n = mystrlen(str1);
    for (int j = 0; j < n; j++) {
        for (int i = 0; str1[i] != 0; i++) {
            if (str1[i] == str3[i]) {
                a++;
                index = i;
            }
            a = 0;
            if (a == n) {
                return &str1[index - n];
            }
        }
    }
    for (int i = 0; str1[i] != 0; i++) {
        str1[i] = '0';
    }
    return str1;
}

невводиться стрічка а вводяться нулі

2

Re: допоможіть(С++(стрічки))

я код переробив на

cout << "Введiть стрiчку : ";
    gets_s(str3);
    gets_s(str3);

і тепер вводиться добре але виводить нулі тепер

3

Re: допоможіть(С++(стрічки))

замість

a = 0;
            if (a == n) {
                return &str1[index - n];
            }

написав

if (a == n) {
                return &str1[index - n];
            }
            a = 0;

не допомогло

4

Re: допоможіть(С++(стрічки))

і це не допомогло

char*mystrstr(char*str1, char*str3) {
    int a = 0, index = 0, ii = 0;
    int n = mystrlen(str1);
    for (int j = 0; j < n; j++) {
        for (int i = 0; str1[i] != 0; i++) {
            if (str1[i] == str3[ii]) {
                a++;
                index = i;
                ii++;
            }
            if (i++ && a != a + 1) {
                a = 0;
                ii = 0;
            }
            if (a == n) {
                return &str1[index - n];
            }
            a = 0;
        }
    }
    for (int i = 0; str1[i] != 0; i++) {
        str1[i] = '0';
    }
    return str1;
}

5 Востаннє редагувалося Parsifal (23.10.2018 20:36:12)

Re: допоможіть(С++(стрічки))

в головній функції змінив на

cout << "Введiть стрiчку : ";
    gets_s(str2);
    gets_s(str3);

і запрацювало але завжди виводить лише яку шукали а не перше входження стрічки

6

Re: допоможіть(С++(стрічки))

було

puts(str3);

а потрібно

puts(bb);

7

Re: допоможіть(С++(стрічки))

тепер працює але завжди виводить нулі

8

Re: допоможіть(С++(стрічки))

завжди виводить лише нулі(останій іф), а не перше входження стрічки
якщо закоментувати останій іф то не працює
мабуть тут щось не так

if (a == n) {
                return &str1[index - n];
            }

9

Re: допоможіть(С++(стрічки))

я створив новий проект скопіював туди

#include <iostream>
#include <conio.h>
using namespace std;
void main() {
    setlocale(LC_ALL, "ru");
    const int a = 100;
    char str1[a];
    cout << "Введiть стрiчку : ";
    gets_s(str1);
    char str3[a];
    cout << "Введiть стрiчку : ";
    gets_s(str3);
    int b = 0, index = 0, ii = 0;
    int n = strlen(str1);
    for (int j = 0; j < n; j++) {
        for (int i = 0; str1[i] != 0; i++) {
            if (str1[i] == str3[ii]) {
                b++;
                index = i;
                ii++;
            }
            if (i++ && a != a + 1) {
                b = 0;
                ii = 0;
            }
            if (a == n) {
                puts(&str1[i - index]);
            }
            b = 0;
        }
    }
    for (int i = 0; str1[i] != 0; i++) {
        str1[i] = '0';
    }
    puts(str1);
    system("pause");
}

і в відладчику пише що після

gets_s(str3);

все занулюється

10

Re: допоможіть(С++(стрічки))

це в стандартній функції помилка чи в мене?

11

Re: допоможіть(С++(стрічки))

тепер здається працює але виводить щось таке наче вийшов за межі масиву

#include <iostream>
#include <conio.h>
using namespace std;
int mystrlen(const char*str);
char*mystrcpy(char*str1, const char*str2);
char*mystrcat(char*str1, const char*str2);
char*mystrchr(char*str, char s);
char*mystrstr(char*str1, char*str3);
void main() {
    char s = 0;
    setlocale(LC_ALL, "ru");
    const int a = 100;
    char str1[a];
    cout << "Введiть стрiчку : ";
    gets_s(str1);
    int n = mystrlen(str1);
    cout << n << "\n";
    char str2[a];
    cout << "Введiть стрiчку : ";
    gets_s(str2);
    char* aaa = mystrcpy(str1, str2);
    cout << str1 << "\n" << str2 << "\n";
    char* aaaa = mystrcat(str1, str2);
    cout << str1 << "\n";
    cout << "Введiть символ : ";
    cin >> s;
    char *aaaaa = mystrchr(str1, s);
    puts(aaaaa);
    char str3[a];
    cout << "Введiть стрiчку : ";
    gets_s(str2);
    gets_s(str3);
    char* bb = mystrstr(str1, str3);
    puts(bb);
    system("pause");
}
char*mystrstr(char*str1, char*str3) {
    int a = 0, index = 0, ii = 0;
    int n = mystrlen(str1);
    for (int j = 0; j < n; j++) {
        for (int i = 0; str1[i] != 0; i++) {
            if (str1[i] == str3[ii]) {
                a++;
                index = i;
                ii++;
            }
            if (i++ && a != a + 1) {
                a = 0;
                ii = 0;
            }
            if (a == n) {
                return &str1[index - n + 1];
            }
            a = 0;
        }
    }
    const int b = 100;
    char str[b];
    for (int i = 0; str1[i] != 0; i++) {
        str[i] = str1[i];
    }
    for (int i = 0; str1[i] != 0; i++) {
        str[i] = '0';
    }
    return str;
}
char *mystrchr(char*str1, char s) {
    for (int i = 0; str1[i] != 0; i++) {
        if (str1[i] == s) {
            return &str1[i];
        }
    }
    for (int i = 0; str1[i] != 0; i++) {
        str1[i] = '0';
    }
    return str1;
}
char*mystrcat(char*str1, const char*str2) {
    int num = 0;
    const int a = 100;
    char str[a];
    for (int i = 0; str1[i] != 0; i++) {
        str[i] = str1[i];
        num++;
    }
    str[num] = '\0';
    int nam = mystrlen(str);
    num = 0;
    for (int i = 0; i < a; i++) {
        if (str1[i] == '\0') {
            str1[i] = ' ';
        }
    }
    int ii = 0;
    for (int i = 0; i < a + a, str2[ii] != 0; i++) {
        if (i < nam) {
            str1[i] = str[i];
            num++;
        }
        if (i > nam) {
            str1[i] = str2[ii];
            ii++;
            num++;
        }
    }
    str1[num] = '\0';
    return str;
}
char*mystrcpy(char*str1, const char*str2) {
    int num = 0;
    const int a = 100;
    char str[a];
    for (int i = 0; str1[i] != 0; i++) {
        str[i] = str1[i];
        num++;
    }
    str[num] = '\0';
    num = 0;
    for (int i = 0; i < a; i++) {
        if (str1[i] == '\0') {
            str1[i] = ' ';
        }
    }
    for (int i = 0; str1[i] != 0; i++) {
        str1[i] = str2[i];
        num++;
    }
    return str;
}
int mystrlen(const char*str) {
    int num = 0;
    for (int i = 0; str[i] != 0; i++) {
        if (str[i] != 0) {
            num++;
        }
    }
    return num;
}

12

Re: допоможіть(С++(стрічки))

h:ЧUдъp laОU°ъp    ]   h:ЧUh:ЧU:ЧUдъp ФНUh:ЧULыp ыp ?`ОUй'I'фэp ?ыp  P1;ыp     ММММММММT

13

Re: допоможіть(С++(стрічки))

Всі ці пункти робляться дуже просто. Нащо ви ліпите так багато стрічок коду ? та ще й за межі виділеної памяті лізете.

Забирайте код і не змушуйте мої очі кровоточити.

MyStrFunctions.h

// MyStrFunctions.h

#ifndef MYSTRFUNCTIONS_H
#define MYSTRFUNCTIONS_H

// визначає довжину стрічки.
int mystrlen(char const *const str);

// копіює всі символи з стрічки str2 в стрічку str1.
// повертає вказівник на першу стрічку str1.
char *mystrcpy(char *const str1, char const *str2);

// приєднує стрічку str2 до стрічки str1.
// повертає вказівник на першу стрічку str1.
char *mystrcat(char *const str1, char const *const str2);

// здійснює пошук символу s в стрічці str.
// повертає вказівник на перше входження символу в стрічку, в іншому випадку 0.
char *mystrchr(char *str, char s);
char const *mystrchr(char const *str, char const s);

// здійснює пошук підстрічки str2 в стрічці str1.
// повертає вказівник на перше входження підстрічки str2 в стрічку str1, в іншому випадку 0.
char *mystrstr(char *str1, char *const str2);
char const *mystrstr(char const *str1, char const *const str2);

// реверсує стрічку і повертає вказівник на нову стрічку.
char *mystrrev(char const *str);

// здійснює пошук символу s в стрічці str.
// повертає індекс символа s в стрічці str, в іншому випадку -1.
int mystrpos(char const *const str, char const s);

// здійснює пошук підстрічки str2 в стрічці str1.
// повертає індекс першого входження стрічки str2 в стрічці str1, в іншому випадку -1.
int mystrpos(char const *const str1, char const *const str2);

#endif

// MyStrFunctions.cpp

// Розкоментуєте, якщо буде потреба :
// #include "MyStrFunctions.h"

// Для дуже старих компілерів
#define nullptr 0

// визначає довжину стрічки.
int mystrlen(char const *const str) {
    char const *ptr(str);
    while(*ptr) ++ptr;
    return ptr - str;
}

// копіює всі символи з стрічки str2 в стрічку str1.
// повертає вказівник на першу стрічку str1.
char *mystrcpy(char *const str1, char const *str2) {
    char *ptr(str1);
    for(; *str2; ++ptr, ++str2) *ptr = *str2;
    *ptr = '\0';
    return str1;
}

// приєднує стрічку str2 до стрічки str1.
// повертає вказівник на першу стрічку str1.
char *mystrcat(char *const str1, char const *const str2) {
    return mystrcpy(str1 + mystrlen(str1), str2);
}

// здійснює пошук символу s в стрічці str.
// повертає вказівник на перше входження символу в стрічку, в іншому випадку 0.
template<typename T>
T *mystrchr(T *str, T s) {
    while(*str && *str != s) ++str;
    return *str == s ? str : nullptr;
}
char *mystrchr(char *str, char s) {
    return mystrchr<char>(str, s);
}
char const *mystrchr(char const *str, char const s) {
    return mystrchr<char const>(str, s);
}

// здійснює пошук підстрічки str2 в стрічці str1.
// повертає вказівник на перше входження підстрічки str2 в стрічку str1, в іншому випадку 0.
template<typename T>
T *mystrstr(T *str1, T *const str2) {
    if(!*str2) return str1;
    str1 = mystrchr(str1, *str2);
    while(str1) {
        T *ptr1(str1), *ptr2(str2);
        do {
            ++ptr1;
            ++ptr2;
        } while(*ptr1 && *ptr2 && *ptr1 == *ptr2);
        if(!*ptr2) return str1;
        str1 = mystrchr(++str1, *str2);
    }
    return nullptr;
}
char *mystrstr(char *str1, char *const str2) {
    return mystrstr<char>(str1, str2);
}
char const *mystrstr(char const *str1, char const *const str2) {
    return mystrstr<char const>(str1, str2);
}

// реверсує стрічку і повертає вказівник на нову стрічку.
char *mystrrev(char const *str) {
    int len(mystrlen(str));
    char *rev = new char[len + 1], *ptr(rev + len);
    *ptr = '\0';
    while(*str) *--ptr = *str++;
    return rev;
}

// здійснює пошук символу s в стрічці str.
// повертає індекс символа s в стрічці str, в іншому випадку -1.
int mystrpos(char const *const str, char const s) {
    char const *ptr(mystrchr(str, s));
    return ptr ? ptr - str : -1;
}

// здійснює пошук підстрічки str2 в стрічці str1.
// повертає індекс першого входження стрічки str2 в стрічці str1, в іншому випадку -1.
int mystrpos(char const *const str1, char const *const str2) {
    char const *ptr(mystrstr(str1, str2));
    return ptr ? ptr - str1 : -1;
}
Main.cpp

// Main.cpp

#include <iostream>
#include "MyStrFunctions.h"

using namespace std;

int main(int argc, char *argv[]) {

    cout << "\r\n mystrlen test :" << endl;
    char const *sys("system"), *net("network"), *coma(", ");
    int sys_len(mystrlen(sys)),
        net_len(mystrlen(net));
    cout << " mystrlen(\"" << sys << "\") == " << sys_len << endl;
    cout << " mystrlen(\"" << net << "\") == " << net_len << endl;

    {
        cout << "\r\n mystrcpy test :" << endl;
        char *str = new char[sys_len + mystrlen(coma) + net_len + 1];
        mystrcpy(str, sys);
        mystrcpy(str + mystrlen(str), coma);
        mystrcpy(str + mystrlen(str), net);
        cout << " \""
            << sys << "\" + \""
            << coma << "\" + \""
            << net << "\" == \""
            << str << "\"" << endl;
        delete[] str;
    }

    {
        cout << "\r\n mystrcat test :" << endl;
        char *str = new char[sys_len + mystrlen(coma) + net_len + 1];
        *str = '\0';
        mystrcat(str, sys);
        mystrcat(str, coma);
        mystrcat(str, net);
        cout << " \""
            << sys << "\" + \""
            << coma << "\" + \""
            << net << "\" == \""
            << str << "\"" << endl;
        delete[] str;
    }

    {
        cout << "\r\n mystrchr test :" << endl;
        char y = 'y', w = 'w';
        char *sys_copy = new char[sys_len + 1],
            *net_copy = new char[net_len + 1];
        *sys_copy = '\0';
        *net_copy = '\0';
        mystrcpy(sys_copy, sys);
        mystrcpy(net_copy, net);
        char *sys_y = mystrchr(sys_copy, y),
            *net_w = mystrchr(net_copy, w);
        cout << " mystrchr(\"" << sys_copy << "\", \'" << y << "\') == \""
            << (sys_y ? sys_y : "-nullptr-") << "\"" << endl;
        cout << " mystrchr(\"" << net_copy << "\", \'" << w << "\') == \""
            << (net_w ? net_w : "-nullptr-") << "\"" << endl;
        delete[] sys_copy;
        delete[] net_copy;
    }

    {
        cout << "\r\n mystrstr test :" << endl;
        char const *st = "st", *wo = "wo",
            *sys_st = mystrstr(sys, st),
            *net_wo = mystrstr(net, wo);
        cout << " mystrstr(\"" << sys << "\", \'" << st << "\') == \""
            << sys_st << "\"" << endl;
        cout << " mystrstr(\"" << net << "\", \'" << wo << "\') == \""
            << net_wo << "\"" << endl;
    }

    {
        cout << "\r\n mystrrev test :" << endl;
        char *sys_rev = mystrrev(sys),
            *net_rev = mystrrev(net);
        cout << " mystrrev(\"" << sys << "\") == " << sys_rev << endl;
        cout << " mystrrev(\"" << net << "\") == " << net_rev << endl;
        delete[] sys_rev;
        delete[] net_rev;
    }

    {
        cout << "\r\n mystrpos test :" << endl;
        char y = 'y', w = 'w';
        int sys_y = mystrpos(sys, y),
            net_w = mystrpos(net, w);
        cout << " mystrpos(\"" << sys << "\", \'" << y << "\') == " << sys_y << endl;
        cout << " mystrpos(\"" << net << "\", \'" << w << "\') == " << net_w << endl;
    }

    cout << "\r\n end. Press enter ..." << endl;
    getchar();
    return 0;
}

Всі ці функції є так званими "небезпечними функціями", бо їм в параметри не можна (принаймні не всюди) пхати nullptr і доводиться слідкувати за виділенням памяті.

Post's attachments

ParsifalStr.7z 17.71 kb, 10 downloads since 2018-10-24 

Подякували: Parsifal1

14 Востаннє редагувалося Parsifal (24.10.2018 14:26:19)

Re: допоможіть(С++(стрічки))

Дякую Леофaне01

15

Re: допоможіть(С++(стрічки))

Прихований текст

Parsifal написав:

Дякую Леофуне

оце так неповага!
правильно буде леофане01!

Говоріть українською! Живіть українською! Відчувайте українською!

16

Re: допоможіть(С++(стрічки))

FakiNyan написав:
Прихований текст

Parsifal написав:

Дякую Леофуне

правильно буде леофане01!

І так, і так можна. Мені байдуже як ви це вимовляєте.