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 * mystrchr (char * str, char s); - Функція здійснює пошук символу s в стрічці str. Функція повертає вказівник на перше входження символу в стрічку, в іншому випадку 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);
void main() {
    int 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);
    system("pause");
}
char*mystrchr(char*str, char s) {
    int index = 0, num = 0;
    for (int i = 0; str[i] != 0; i++) {
        if (str[i] == s) {
            index = i;
            break;
        }
    }
    const int a = 100;
    char str1[a];
    for (int i = 0; str1[i + index] != 0; i++) {
        str1[i] = str[i + index];
        num++;
    }
    char* str2 = nullptr;
    if (index != 0) {
        return str1;
    }
    else {
        return str2;
    }
}
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*mystrchr(char*str, char s) {
    int index = 0, num = 0;
    for (int i = 0; str[i] != 0; i++) {
        if (str[i] == s) {
            index = i;
            break;
        }
    }
    const int a = 100;
    char str1[a];
    for (int i = 0; str1[i + index] != 0; i++) {
        str1[i] = str[i + index];
        num++;
    }
    char* str2 = nullptr;
    if (index != 0) {
        return str1;
    }
    else {
        return str2;
    }
}

ось скріншот помилки(останій рядок тільки в компіляторі відноситься до завдання і помилка)
http://replace.org.ua/misc.php?action=pun_attachment&amp;item=1928&amp;download=0

Post's attachments

Без імені.png 73.25 kb, 144 downloads since 2018-10-22 

2

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

при

return str1;

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

char* str2 = nullptr;
return str2;

помилку що на скріншоті

3 Востаннє редагувалося Parsifal (22.10.2018 19:59:16)

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

щось подібне на це виводить
ФхЮ ¤хЮ ?`CV~gтшЮ цЮ  ?{ГхЮ     ММММММММd

4

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

Логічно. str1 - це масив, що є локальною змінною в функції mystrchr. Ви виходите з функції і передаєте вказівник на цю змінну; але змінна знищується при виході з функції, і вказівник вказує казна-куди.

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

5

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);
void main() {
    int 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);
    system("pause");
}
char*mystrchr(char*str1, char s) {
    int index = 0, num = 0;
    for (int i = 0; str1[i] != 0; i++) {
        if (str1[i] == s) {
            index = i;
            break;
        }
    }
    const int a = 100;
    char str[a];
    for (int i = 0; str1[i] != 0; i++) {
        str[i] = str1[i + index];
        num++;
    }
    char* str2 = nullptr;
    return str;
    /*if (index != 0) {
        return str;
    }
    else {
        return str2;
    }*/
}
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*mystrchr(char*str1, char s) {
    int index = 0, num = 0;
    for (int i = 0; str1[i] != 0; i++) {
        if (str1[i] == s) {
            index = i;
            break;
        }
    }
    const int a = 100;
    char str[a];
    for (int i = 0; str1[i] != 0; i++) {
        str[i] = str1[i + index];
        num++;
    }
    char* str2 = nullptr;
    return str;
    /*if (index != 0) {
        return str;
    }
    else {
        return str2;
    }*/
}

6

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

Ви маєте повертати вказівник на елемент тієї стрічки, яку передали в функцію, тобто &str1[index].

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

7

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

виводить нормально але без змін тещо й передавав до того

8

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

це непотрібне здається

Прихований текст
const int a = 100;
    char str[a];
    for (int i = 0; str1[i] != 0; i++) {
        str[i] = str1[i + index];
        num++;
    }

9

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

ось функція зараз

Прихований текст
char*mystrchr(char*str1, char s) {
    int index = 0, num = 0;
    for (int i = 0; str1[i] != 0; i++) {
        if (str1[i] == s) {
            index = i;
            break;
        }
    }
    const int a = 100;
    char str[a];
    for (int i = 0; str1[i] != 0; i++) {
        str[i] = str1[i + index];
        num++;
    }
    char* str2 = nullptr;
    return &str1[index];
    /*if (index != 0) {
        return str;
    }
    else {
        return str2;
    }*/
}

10

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

зараз видаляє перший елемент

11

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

А що ви в другому циклі робите?

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

12 Востаннє редагувалося Parsifal (22.10.2018 20:24:34)

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

здається ця функція не працює

for (int i = 0; str1[i] != 0; i++) {
        if (str1[i] == s) {
            index = i;
            goto link;
        }
    }
    link:

що це?

Post's attachments

Без імені.png 107.7 kb, 112 downloads since 2018-10-22 

13

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

як цю штуку виправити і що це за штука?

14

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

без goto всерівно ця штука залишається

15

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

koala написав:

А що ви в другому циклі робите?

уже нічого він здається був непотрібен

16

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);
void main() {
    int 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);
    system("pause");
}
char *mystrchr(char*str1, char s) {
    int index = 0;
    for (int i = 0; str1[i] != 0; i++) {
        if (str1[i] == s) {
            index = i;
        }
    }

    //char* str2 = nullptr;
    return &str1[index];
    /*if (index != 0) {
        return &str1[index];
    }
    else {
        return str2;
    }*/
}
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 *mystrchr(char*str1, char s) {
    int index = 0;
    for (int i = 0; str1[i] != 0; i++) {
        if (str1[i] == s) {
            index = i;
        }
    }

    //char* str2 = nullptr;
    return &str1[index];
    /*if (index != 0) {
        return &str1[index];
    }
    else {
        return str2;
    }*/
}

а ось головна функція

Прихований текст
void main() {
    int 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);
    system("pause");
}

17

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

Пропустили повернення nullptr

char *mystrchr(char*str1, char s) {
    for (int i = 0; str1[i] != 0; i++) {
        if (str1[i] == s) {
            return &str1[i];
        }
    }
    return nullptr;
}

чи навіть (з використанням арифметики вказівників)

char *mystrchr(char *where, char what) {
    for ( ; *where; ++where ) {
        if (*where == what) {
            return where;
        }
    }
    return nullptr;
}
Подякували: Parsifal1

18

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

не допомогло всерівно помилка

19

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

А ви певні, що передаєте до функції правильні дані?

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

20

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

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