Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2022, 14:54   #1
Huseyn AX
Пользователь
 
Регистрация: 14.11.2021
Сообщений: 43
По умолчанию Прекращение программы после ввода в c++

Код:
#include <iostream>
#include <cstring>
#include <cctype>



class String
{
private:
char *str;
int len;
public:
String();
String(const char *s);
String(const String &st);
~String();


void stringlow();
void stringup();
int has(char symb);
int length() const { return len; }


String & operator=(const String &st);
String & operator=(const char *s);
String & operator+(String &ob);



friend std::ostream & operator<<(std::ostream &os, const String &st);
friend std::istream & operator>>(std::istream &ci, String &st);
friend String & operator+(const char *s, String &ob);
friend bool operator==(const String &st1, const String &st2);
};
String::String()
{
    len = 1;
    str = new char[len];
    str[0] = '\0';
}
String::String(const char *s)
{
    len = strlen(s) + 1;
    str = new char[len];
    strcpy(str, s);
}
String::String(const String &st)
{
    len = st.len;
    str = new char[len];
    strcpy(str, st.str);
}
String::~String()
{
    delete []str;
}
void String::stringlow()
{
    for(int i = 0; i < len; i++)
    {
        if(isupper(str[i]))
        {
            str[i] = tolower(str[i]);
        }
    }
    std::cout << str << std::endl;
}
void String::stringup()
{
    for(int i = 0; i < len; i++)
    {
        if(islower(str[i]))
        {
            str[i] = toupper(str[i]);
        }
    }
    std::cout << str << std::endl;
}
int String::has(char symb)
{
    int val = 0;
    for(int i = 0; i <= strlen(str); i++)
    {
        if(str[i] == symb) val++;
    }
    return val;
}
String & String::operator=(const String &st)
{
    if(this == &st) return *this;
    len = st.len;
    str = new char[len];
    strcpy(str, st.str);
    return *this;
}
String & String::operator=(const char *s)
{
    len = strlen(s) + 1;
    str = new char[len];
    strcpy(str, s);
    return *this;
}
String & String::operator+(String &ob)
{
    if(this == &ob) return *this;
    int len2 = (len + ob.len) - 1;
    char *strftime = new char [ob.len];
    char *sftime = new char [len2];
    strcpy(strftime, ob.str);
    strftime[strlen(ob.str) + 1] = ' ';
    strcpy(sftime, str);
    strcat(sftime, strftime);
    String ftime(sftime);
    return ftime;
}
std::ostream & operator<<(std::ostream &os, const String &st)
{
    os << st.str << std::endl;
    return os;
}
std::istream & operator>>(std::istream &ci, String &st)
{
    char temp[80];
    ci.get(temp, 80);
    if(ci) st = temp;
    while(ci && ci.get() != '\n') continue;
    return ci;
}
String & operator+(const char *s, String &ob)
{
    int len2 = strlen(s) + ob.len;
    char *strftime = new char [ob.len];
    char *sftime = new char [len2];
    strcpy(strftime, ob.str);
    strcpy(sftime, s);
    strcat(sftime, strftime);
    String ftime(sftime);
    return ftime;
}
bool operator==(const String &st1, const String &st2)
{
    if(strcmp(st1.str, st2.str) == 0) return true;
    else return false;
}
int main()
{
    String s1("and i am a c++ student");
    String s2 = "Please enter your name: ";
    String s3;
    std::cout << s2;
    std::cin >> s3;
    s2 = "My name is " + s3;
    s2.stringup();
    std::cout << "The string\n" << s2 << "\ncontains " << s2.has('A') << " 'A' characters in it.\n";
    s1 = "red";
    String rgb[3] = { String(s1), String("green"), String("blue")};
    std::cout << "Enter the name of a primary color for mixing light: ";
    String ans;
    bool success = false;
    while(std::cin >> ans)
    {
        ans.stringlow();
        for(int i = 0; i < 3; i++)
        {
            if(ans == rgb[i])
            {
                std::cout << "That's right!\n";
                success = true;
                break;
            }
        }
        if(success) break;
        else std::cout << "Try again!\n";
    }
    std::cout << "Bye!\n";
    return 0;
}
Класс String работает со строкой, может копировать строку и класс в вызывающей объект(конструктор копирования и перегруженный оператор =), может превращать прописные буквы в строчные(функция-элемент stringup()) а также наоборот(функция элемент stringlow()), функция has ищет букву заданную в аргументах в str если найдет то увеличивается переменная val, operator+ прибавляет строки двух объектов в единое целое а его дружественная версия прибавляет строку(то есть const char *s) с строкой в объекте, дружественный operator== проверят равны ли строки в двух объектах если да то возвращает true если нет то false.Проблема в том что когда программа просить вести значения в объект(152 строка) программа прекращает выполняться после того как написал что то, думаю проблема в 153 строке возможно неправильно написал дружественный operator+ или нет. Также при компиляции компилятор пишет это:
Код:
Newcpp.cpp: In member function 'String& String::operator+(String&)':      
Newcpp.cpp:115:12: warning: reference to local variable 'ftime' returned  
-Wreturn-local-addr]
  115 |     return ftime;
      |            ^~~~~
Newcpp.cpp:114:12: note: declared here
  114 |     String ftime(sftime);
      |            ^~~~~
Newcpp.cpp: In function 'String& operator+(const char*, String&)':        
Newcpp.cpp:139:12: warning: reference to local variable 'ftime' returned  
-Wreturn-local-addr]
  139 |     return ftime;
      |            ^~~~~
Newcpp.cpp:138:12: note: declared here
  138 |     String ftime(sftime);
Думаю все понятно объяснил, заранее спасибо за вашу помощь
Huseyn AX вне форума Ответить с цитированием
Старый 13.09.2022, 12:22   #2
Huseyn AX
Пользователь
 
Регистрация: 14.11.2021
Сообщений: 43
По умолчанию

Помощи не надо я решил проблема, проблема заключалось в String & у обеих operator+ я написал просто String и все сработало !
Huseyn AX вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++, Прекращение работы программы после выполнения условия Александр222 Общие вопросы C/C++ 1 21.09.2020 19:20
как называется технология отображения в подсказке, после ввода точки, до ввода первого символа, метода из другого файла на который ссылается редактируемый файл? lenivaya10001 Свободное общение 1 04.10.2016 21:53
Прекращение работы программы. vers0 Общие вопросы Delphi 2 25.10.2015 17:01
После запуска программы отображаются: две строки для ввода текущих курсов для евро и доллара; 5568 Lazarus, Free Pascal, CodeTyphon 1 13.10.2014 22:03
Прекращение работы программы EddieG Общие вопросы C/C++ 2 16.01.2011 22:52