Код:
#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);
Думаю все понятно объяснил, заранее спасибо за вашу помощь