2016-02-13 1 views
-4

Я пишу этот кодкод выхода 3221225477 C++

#ifndef RECTANGLE_H 
#define RECTANGLE_H 
#include <iostream> 
#include <cstddef> 

using namespace std; 

class MyString 
{ 
public: 
    MyString(const char ch, int size); 
    MyString(const char chars[], int size); 
    char at(int index) const; 
    int length() const; 
    MyString append(const MyString& s); 
    MyString append(int n, char ch); 
    MyString assign(const MyString& s, int index, int n); 
    MyString assign(const MyString& s, int n); 
    MyString assign(int n, char ch); 
    MyString substr(int index, int n) const; 
    MyString substr(int index) const; 
    void clear(); 
    bool empty() const; 
private: 
    char* chars; 
    int size; 
}; 

MyString::MyString(const char ch, int size) 
{ 
    this->size = size; 
    this->chars[this->size] = ch; 
} 

MyString::MyString(const char chars[], int size) 
{ 
    for(int i = 0; i < size; i++) 
    { 
     this->chars[i] = chars[i]; 
    } 
    this->size = size; 
} 

char MyString::at(int index) const 
{ 
    return chars[index]; 
} 

int MyString::length() const 
{ 
    return this->size; 
} 

MyString MyString::append(const MyString& s) 
{ 
    const int newSize = size + s.length(); 
    char *newChars = new char[newSize]; 
    for(int i = 0; i < size; i++) 
    { 
     newChars[i] = chars[i]; 
    } 
    int k = 0; 
    for(int j = size; j < newSize; j++) 
    { 
     newChars[j] = s.chars[k]; 
     k++; 
    } 
    MyString myString(newChars, newSize); 
    return myString; 
} 

MyString MyString::append(int n, char ch) 
{ 
    for(int i = 0; i < n; i++) 
    { 
     chars[i] = ch; 
    } 
    MyString myString(chars, n); 
    return myString; 
} 

MyString MyString::assign(const MyString& s, int index, int n) 
{ 
    int j = 0; 
    const int newSize = n; 
    for(int i = index; i < index + n; i++) 
    { 
     chars[j] = s.chars[i]; 
     j++; 
    } 
    MyString myString(chars, newSize); 
    return myString; 
} 

MyString MyString::assign(const MyString& s, int n) 
{ 
    char *newChars = new char[n]; 
    for(int i = 0; i < n; i++) 
    { 
     newChars[i] = s.chars[i]; 
    } 
    MyString myString(newChars, n); 
    return myString; 
} 

MyString MyString::assign(int n, char ch) 
{ 
    char *newChars = new char[n]; 
    for(int i = 0; i < n; i++) 
    { 
     newChars[i] = ch; 
    } 
    MyString myString(newChars, n); 
    return myString; 
} 

MyString MyString::substr(int index, int n) const 
{ 
    const int newSize = n; 
    char *newChars = new char[newSize]; 
    int j = 0; 
    for(int i = index; i < index + n; i++) 
    { 
     newChars[j] = chars[i]; 
     j++; 
    } 
    MyString myString(newChars, newSize); 
    return myString; 
} 

MyString MyString::substr(int index) const 
{ 
    const int newSize = size - index; 
    char *newChars = new char[newSize]; 
    int j = index; 
    for(int i = 0; i < newSize; i++) 
    { 
     newChars[i] = chars[j]; 
     j++; 
    } 
    MyString myString(newChars, newSize); 
    return myString; 
} 

void MyString::clear() //Clear all the elements in the chars array 
{ 
    chars = NULL; 
} 

bool MyString::empty() const //Check if the chars array is empty 
{ 
    if(this->size == 0) 
     return true; 
    return false; 
} 

int main() 
{ 
    int size1 = 5; 
    char chars1[] = {'H', 'E', 'L', 'L', 'O'}; 
    int size2 = 1; 
    char chars2 = 'A'; 
    MyString str1(chars1, size1); 
    MyString str2(chars2, size2); 
    cout << "str1.length() : " << str1.length() << endl; 
    cout << "str1.at(3) : " << str1.at(3) << endl; 
    cout << str1.append(str2).length() << endl; 
    cout << "str1.substr(2)" << str1.substr(2) << endl; 
    cout << str1.substr(2).at(2) << endl; 
    return 0; 
} 
#endif 

Когда я copile, он не показывает каких-либо ошибок. Но когда я запускаю его, он показывает ошибки с кодом выхода 3221225477 с окном вроде TestMyString.exe перестает работать. Windows может проверить онлайн для решения проблемы. blah blah ...

Пожалуйста, помогите!

+2

Вам нужно запустить его в отладчике, чтобы вы могли видеть, где проблема. – interjay

+0

Где произошел сбой кода при запуске через отладчик? – dreamlax

+0

Кроме того, я не стал читать весь ваш код, но что-то торчало, как больной палец. Ваш метод 'MyString :: clear()' устанавливает 'chars' в' NULL', который утечки памяти. – dreamlax

ответ

0

Ваша основная проблема заключается в конструкторах MyString

MyString::MyString(const char ch, int size) 
{ 
    this->size = size; 
    this->chars[this->size] = ch; 
} 

MyString::MyString(const char chars[], int size) 
{ 
    for(int i = 0; i < size; i++) 
    { 
     this->chars[i] = chars[i]; 
    } 
    this->size = size; 
} 

В обоих случаях chars член MyString является указателем, и конструкторы не делают ничего, чтобы инициализировать его, не говоря уже убедиться, что он указывает на действительный области памяти, перед копированием данных на него. Это дает неопределенное поведение.

Результатом вышесказанного является то, что, в main()

MyString str1(chars1, size1); 
MyString str2(chars2, size2); 

проявляют непредсказуемое поведение. Аналогично в других местах, где MyString построен аналогичным образом.

 Смежные вопросы

  • Нет связанных вопросов^_^