#include <iostream>
#include <string>
using namespace std;
class String //user-defined string type
{
protected:
enum { SZ = 80 }; //size of all String objects
char str[SZ]; //holds a C-string
public:
String() //no-arg constructor
{ str[0] = '\0'; }
String( char s[] ) //1-arg constructor
{ strcpy(str, s); } // convert C-string to String
void display() const //display the String
{ cout << str; }
operator char*() //conversion operator
{ return str; } //convert String to C-string
};
// Если длина 's' больше 79, копируем только 80 символов
// Если меньше просто копируем s в str
class Pstring: public String
{
public:
Pstring():String()
{}
Pstring( char s[] )
{
if (strlen(s)>SZ-1)
{
for (int j=0; j<SZ-1; j++)
{
str[j]=s[j];
str[j+1]='\0';
}
}
else
{
strcpy(str, s);
}
}
char* left(Pstring st, int n)
{
for (int i=0; i<=n; i++)
{
str = st.str;
str[i+1]='\0';
}
return str;
}
char* mid(Pstring st, int s, int n)
{
int u=0;
int start = s-1; // 9-1=8
int end = (n+start)-1; // 18+8=26
for (int i=start; i<=end; i++)
{
str = st.str;
str[i+1]='\0';
u++;
}
return str;
}
char* right(Pstring st, int n)
{
int u = 0;
int len = strlen(st.str); // 54 - кол-во символов (54='\0')
int start = strlen(st.str)-n; // 49 - первый копируемый символ 'U'ser
int end = strlen(st.str)-1; // 53 - последный '.'\0
for (int i=start; i<=end; i++) // start=48, end=53;
{
str = st.str;
str[u+1]='\0';
u++;
}
return str;
}
};
////////////////////////////////////////////////////////////////
int main()
{
Pstring s1 = "It is a pleasure to welcome you as a new Premium User."; // кол-во символов 54 (0...53)
Pstring s2,s3,s4;
cout << s2.left(s1,7) << endl;
cout << s3.mid(s1,9,18) << endl;
cout << s4.right(s1,5) << endl;
return 0;
}
Возврат по ссылке и error C2440
Цитата:
В некоторых компьютерных языках, таких как Visual Basic, есть операции, с помощью которых можно выделить часть строки и присвоить ее другой строке. (В стандартном классе string предложены различные подходы.) Используя наследование, добавьте такую возможность в класс Pstring из упражнения 2. В новом производном классе Pstring2 разместите три новых функции: left(), mid(), right().
s2.left ( s1, n )
в строку s2 помещается n самых левых символов строки s1
s2.mid ( s1, s, n )
в строку s2 помещаются n символов из строки начиная с символов номер s
s2.right ( s1, n )
В строку s2 помещаются n самых правых символов строки s1
Вы можете использовать цикл for для копирования символ за символом подходящих частей строки s1 во временный объект класса Pstring2, который затем их возвратит. Для получения лучшего результата используйте в этих функциях возврат по ссылке, чтобы они могли быть использованы с левой строны знака "равно" для изменения части существующей строки.
s2.left ( s1, n )
в строку s2 помещается n самых левых символов строки s1
s2.mid ( s1, s, n )
в строку s2 помещаются n символов из строки начиная с символов номер s
s2.right ( s1, n )
В строку s2 помещаются n самых правых символов строки s1
Вы можете использовать цикл for для копирования символ за символом подходящих частей строки s1 во временный объект класса Pstring2, который затем их возвратит. Для получения лучшего результата используйте в этих функциях возврат по ссылке, чтобы они могли быть использованы с левой строны знака "равно" для изменения части существующей строки.
Вот решение:
Код:
Все замечательно работает, только не получается вернуть по ссылке :)
Если я заменю:
Код:
char* left(Pstring st, int n)
{
for (int i=0; i<=n; i++)
{
str = st.str;
str[i+1]='\0';
}
return str;
}
{
for (int i=0; i<=n; i++)
{
str = st.str;
str[i+1]='\0';
}
return str;
}
На:
Код:
char& left(Pstring st, int n)
{
for (int i=0; i<=n; i++)
{
str = st.str;
str[i+1]='\0';
}
return str;
}
{
for (int i=0; i<=n; i++)
{
str = st.str;
str[i+1]='\0';
}
return str;
}
Компилятор выдаст ошибку:
Цитата:
error C2440: 'return' : cannot convert from 'char [80]' to 'char &'
Не могу понять почему " cannot convert from 'char [80]' to 'char &' "
P.S. Указатели я не изучал, звездочки поставил тупо методом перебора..
Хотелось бы сделать правильно..
Код:
#include <iostream>
#include <string>
using namespace std;
class String //user-defined string type
{
protected:
enum { SZ = 80 }; //size of all String objects
char str[SZ]; //holds a C-string
public:
String() //no-arg constructor
{ str[0] = '\0'; }
String( char s[] ) //1-arg constructor
{ strcpy(str, s); } // convert C-string to String
void display() const //display the String
{ cout << str; }
operator char*() //conversion operator
{ return str; } //convert String to C-string
};
// Если длина 's' больше 79, копируем только 80 символов
// Если меньше просто копируем s в str
class Pstring: public String
{
public:
Pstring():String()
{}
Pstring( char s[] )
{
if (strlen(s)>SZ-1)
{
for (int j=0; j<SZ-1; j++)
{
str[j]=s[j];
str[j+1]='\0';
}
}
else
{
strcpy(str, s);
}
}
String& left(Pstring st, int n)
{
for (int i=0; i<=n; i++)
{
str = st.str;
str[i+1]='\0';
}
return *this;
}
String& mid(Pstring st, int s, int n)
{
int u=0;
int start = s-1; // 9-1=8
int end = (n+start)-1; // 18+8=26
for (int i=start; i<=end; i++)
{
str = st.str;
str[i+1]='\0';
u++;
}
return *this;
}
String& right(Pstring st, int n)
{
int u = 0;
//int len = strlen(st.str); // 54 - кол-во символов (54='\0')
int start = strlen(st.str)-n; // 49 - первый копируемый символ 'U'ser
int end = strlen(st.str)-1; // 53 - последный '.'\0
for (int i=start; i<=end; i++) // start=48, end=53;
{
str = st.str;
str[u+1]='\0';
u++;
}
return *this;
}
};
////////////////////////////////////////////////////////////////
int main()
{
Pstring s1 = "It is a pleasure to welcome you as a new Premium User."; // кол-во символов 54 (0...53)
Pstring s2,s3,s4;
s2.left(s1,7).display();
cout << endl;
s3.mid(s1,9,18).display();
cout << endl;
s4.right(s1,5).display();
cout << endl;
return 0;
}
#include <string>
using namespace std;
class String //user-defined string type
{
protected:
enum { SZ = 80 }; //size of all String objects
char str[SZ]; //holds a C-string
public:
String() //no-arg constructor
{ str[0] = '\0'; }
String( char s[] ) //1-arg constructor
{ strcpy(str, s); } // convert C-string to String
void display() const //display the String
{ cout << str; }
operator char*() //conversion operator
{ return str; } //convert String to C-string
};
// Если длина 's' больше 79, копируем только 80 символов
// Если меньше просто копируем s в str
class Pstring: public String
{
public:
Pstring():String()
{}
Pstring( char s[] )
{
if (strlen(s)>SZ-1)
{
for (int j=0; j<SZ-1; j++)
{
str[j]=s[j];
str[j+1]='\0';
}
}
else
{
strcpy(str, s);
}
}
String& left(Pstring st, int n)
{
for (int i=0; i<=n; i++)
{
str = st.str;
str[i+1]='\0';
}
return *this;
}
String& mid(Pstring st, int s, int n)
{
int u=0;
int start = s-1; // 9-1=8
int end = (n+start)-1; // 18+8=26
for (int i=start; i<=end; i++)
{
str = st.str;
str[i+1]='\0';
u++;
}
return *this;
}
String& right(Pstring st, int n)
{
int u = 0;
//int len = strlen(st.str); // 54 - кол-во символов (54='\0')
int start = strlen(st.str)-n; // 49 - первый копируемый символ 'U'ser
int end = strlen(st.str)-1; // 53 - последный '.'\0
for (int i=start; i<=end; i++) // start=48, end=53;
{
str = st.str;
str[u+1]='\0';
u++;
}
return *this;
}
};
////////////////////////////////////////////////////////////////
int main()
{
Pstring s1 = "It is a pleasure to welcome you as a new Premium User."; // кол-во символов 54 (0...53)
Pstring s2,s3,s4;
s2.left(s1,7).display();
cout << endl;
s3.mid(s1,9,18).display();
cout << endl;
s4.right(s1,5).display();
cout << endl;
return 0;
}
Спасибо, буду разбираться с указателями.