In: Computer Science
IMPLEMENT the Following instructions into the String.hpp and String.cpp provided. DO NOT just simply copy the code I give you as your answer
Intructions:
Implementation:
For your String class:
Implement method String String::substr(int start_pos, int count) const;. This will return the specified substring starting at start_pos and consisting of count characters (there will be less than count if it extends past the end of the string).
Implement method int String::find(char ch, int start_pos) const; which gives the first location starting at start_pos of the character ch or -1 if not found.
Implement method int String::find(const String & s, int start_pos) const; which gives the first location starting at start_pos of the substring s or -1 if not found.
Implement a method std::vector<String> String::split(char) const;
You will use std::vector<> (need to include <vector>) for storing the results of parsing the input data.
This method will return a vector of String split up based on a supplied character. For example given s = "abc ef gh", the call s.split(' ') will return a vector with three strings: "abc", "ef", and "gh".
std::vector has a number of operations defined including operator[], and size (number of elements in the vector).
-------------------------------------------------------------------------------------
string.hpp
-------------------------------------------------------------------------------------
#ifndef STRING_HPP #define STRING_HPP #include <iostream> /** * @invariant str[length()] == 0 * && length() == capacity() * && capacity() == stringSize - 1 */ class String { private: // helper constructors and methods String(int); String(int, const char *); void reset_capacity (int); char * str; // size includes NULL terminator int string_size; public: // constructor: empty string, String('x'), and String("abcd") String(); String(char); String(const char *); // copy ctor, destructor, constant time swap, and assignment String(const String &); ~String(); void swap (String &); String & operator= (String); // subscript: accessor/modifier and accessor char & operator[](int); char operator[](int) const; // max chars that can be stored (not including null terminator) int capacity() const; // number of char in string int length () const; // concatenation String operator+ (const String &) const; String & operator+=(String); // relational methods bool operator==(const String &) const; bool operator< (const String &) const; // i/o friend std::ostream& operator<<(std::ostream &, const String &); friend std::istream& operator>>(std::istream &, String &); }; // free functios for concatenation and relational String operator+ (const char *, const String &); String operator+ (char, const String &); bool operator== (const char *, const String &); bool operator== (char, const String &); bool operator< (const char *, const String &); bool operator< (char, const String &); bool operator<= (const String &, const String &); bool operator!= (const String &, const String &); bool operator>= (const String &, const String &); bool operator> (const String &, const String &); #endif
-------------------------------------------------------------------------------
string.cpp
-------------------------------------------------------------------------------
#include <cstring> #include <iostream> #include <cassert> #include "string.hpp" String::String(int n){ string_size = n; str = new char[n]; str[0] = '\0'; } String::~String(){ delete [] str; } String::String(int x, const char *str1){ string_size = x; str = new char[x]; int pos = 0; while(str1[pos] != '\0') { str[pos] = str1[pos]; ++pos; } str[pos] = '\0'; } void String::reset_capacity(int x){ String str1(x, str); swap(str1); } String::String(){ str = new char[1]; str[0] = '\0'; string_size = 1; } String::String(char ch){ string_size = 2; str = new char[string_size]; str[0] = ch; str[1] = '\0'; } String::String(const char* s){ int counter = 0; while(s[counter] != '\0'){ ++counter; } string_size = counter + 1; str = new char[string_size]; for(int i = 0; i < counter ; i++){ str[i] = s[i]; } str[counter] = '\0'; } String::String(const String& s){ string_size = s.string_size; str = new char[string_size]; int pos = 0; for(int i = 0; i < string_size; ++i){ str[i] = s.str[i]; ++pos; } } int String::length() const{ int size = 0; while(str[size] != '\0') ++size; return size; } int String::capacity() const{ return string_size - 1; } String& String::operator=(String str1){ string_size = str1.string_size; for(int i = 0; i < string_size; i++){ str[i] = str1.str[i]; } return *this; } char& String::operator[](int i){ assert(i >= 0); assert(i <= length()); return str[i]; } void String::swap(String& str1){ int tempStr = string_size; string_size = str1.string_size; str1.string_size = tempStr; char* tempStr1 = str; str = str1.str; str1.str = tempStr1; } char String::operator[](int i) const{ assert(i >= 0); assert(i <= length()); return str[i]; } bool String::operator==(const String& rhs) const{ int pos = 0; while(str[pos] != '\0' && str[pos] == rhs.str[pos]){ ++pos; } return str[pos] == rhs.str[pos]; } std::istream& operator>>(std::istream& in, String& rhs){ in >> rhs.str; return in; } std::ostream& operator<<(std::ostream& out, const String& rhs){ out << rhs.str; return out; } bool String::operator<(const String& rhs) const{ int pos = 0; while(str[pos] != '\0' && rhs.str[pos] != '\0' && str[pos] == rhs.str[pos]){ ++pos; } return str[pos] < rhs.str[pos]; } String String::operator+(const String& rhs) const{ int offset2 = (length() + rhs.length()) + 1; String result(offset2); int offset = length(); int count = 0; int pos = 0; while(str[count] != '\0'){ result.str[count] = str[count]; ++count; } while(rhs.str[pos] != '\0'){ result.str[offset + pos] = rhs.str[pos]; ++pos; } result.str[offset2 - 1] = '\0'; return result; } String& String::operator+=(String rhs){ int offset = length(); int pos = 0; int newSize = (length() + rhs.length()) + 1; String result(newSize); reset_capacity(newSize); for(int x = offset; x < newSize; ++x){ str[x] = rhs.str[pos]; ++pos; } str[newSize - 1] = '\0'; return *this; } String operator+(const char charArray[], const String& rhs){ String s(charArray); return rhs + s; } String operator+(char s, const String& rhs){ return s + rhs; } bool operator==(const char charArray[], const String& rhs){ if(charArray == rhs){ return true; } else{ return false; } } bool operator==(char s, const String& rhs){ if(s == rhs){ return true; } else{ return false; } } bool operator<(const char charArray[], const String& rhs){ if(charArray < rhs){ return true; } else{ return false; } } bool operator<(char s, const String& rhs){ if(s < rhs){ return true; } else{ return false; } } bool operator<=(const String& lhs, const String& rhs){ if(lhs < rhs || lhs == rhs){ return true; } else{ return false; } } bool operator!=(const String& lhs, const String& rhs){ if(lhs.length() != rhs.length()){ return true; } int pos = 0; while(lhs[pos] != rhs[pos]){ pos++; } if(pos == lhs.length()){ return true; } return false; } bool operator>=(const String& lhs, const String& rhs){ if(lhs > rhs || lhs == rhs) { return true; } else{ return false; } } bool operator>(const String& lhs, const String& rhs){ if(!(lhs <= rhs)){ return true; } else{ return false; } }
Here are the functions for you:
String String::substr(int start_pos, int count) const{
char s[count+1];
int i, pos=0;
for(int i = start_pos; (i < string_size-1) && (pos <
count); i++){
s[pos++] = str[i];
}
s[pos] = '\0';
return String(s);
}
int String::find(char ch, int start_pos) const{
int i=start_pos;
int index = -1;
for(int i = start_pos; (i < string_size-1); i++){
if(str[i] == ch)
return i;
}
return index;
}
int String::find(const String & s, int start_pos) const
{
int i=start_pos;
int len = s.string_size-1;
int index = -1;
for(int i = start_pos; (i < string_size-1); i++){
bool found = true;
for(int j=0; ((j+i) < string_size-1) && j < len; j++)
{
if(str[i+j] != s.str[j]) {
found = false;
break;
}
}
if(found) {
return i;
}
}
return index;
}
std::vector<String> String::split(char ch) const{
std::vector<String> v;
int start = 0;
for(int i=0; i< string_size-1; i++) {
// if character matches, provide the string from start to
this
// position and then move start to i+1
if(str[i] == ch) {
if(i > start) {
v.push_back(substr(start, i-start));
start = i+1;
}
}
}
// push the remaining string
if(start < string_size-1) {
v.push_back(substr(start, string_size-1));
}
return v;
}