2016-06-15 24 views
-5

最後の学期のC++クラスの課題をすべて夏にコーディングして、C++ 3の準備を整えることにしましたが、Stringクラスをどのように渡すかわかりません2つの文字列を連結して、結果をメインのcppファイルに表示するために必要なステップもあります。私MAIN.CPPで :私のString.cppで文字列と文字列:: Concat(const char str [])

#include <iostream> 
using namespace std; 

#include "String.h" 

int main() 
{ 
    String Str1; 
    String Str2("this is a test"); 
    String Str3(Str2); 
    String Str4("bruh"); 
    int result; 

    cout << "Testing Display: " << endl; 
    Str2.Display(); 
    cout << endl; 
    cout << "Testing displayLine: " << endl; 
    Str2.displayLine(); 
    cout << endl; 

    result = Str2.Compare(Str3); 
    if (result < 0) 
    { 
     Str2.Display(); 
     cout << " comes before " << endl; 
     Str3.Display(); 
     cout << endl; 
    } 

    else 
     if (result > 0) 
     { 
      Str3.Display(); 
      cout << " comes before " << endl; 
      Str2.Display(); 
     } 
     else 
     { 
      Str3.Display(); 
      cout << " is equal to " << endl; 
      Str2.Display(); 
     } 
    cout << endl; 

    result = Str2.Compare("wxyz"); 
    Str1.Copy(Str3); 

    cout << "Str1 contains " << Str1.length() <<" characters"<< endl; 


    cout << "Concatenation: "; 
    Str2.Concat(Str4); 
     cout << endl; 

    return 0; 
} 

:私string.hの中

#include <iostream> 
using namespace std; 
#include <string.h> 
#include "String.h" 

#pragma warning(disable:4996) 

String::String() 
{ 
    NumChars = 0; 
    MaxSlots = 0; 
    pChar = new char[NumChars+1]; 
    pChar[0] = '\0'; 
} 

String::String(const char Str[]) 
{ 
    NumChars = strlen(Str); 
    pChar = new char[NumChars + 1]; 
    strcpy(pChar, Str); 
} 

String::String(const String & Str) 
{ 
    NumChars = Str.NumChars; 
    pChar = new char[NumChars + 1]; 
    strcpy(pChar, Str.pChar); 
} 

String::~String() 
{ 
    delete[] pChar; 
} 

int String::Compare(const String & Str) const 
{ 
    return strcmp(pChar, Str.pChar);  //case sensitive 
} 

int String::Compare(const char Str[]) const 
{ 
    return strcmp(pChar, Str);   //case sensitive 
} 

String& String::Copy(const String & Str) 
{ 
    if (this != &Str) 
    { 
     if (MaxSlots < Str.NumChars) 
     { 
      delete[]pChar; 
      MaxSlots = Str.NumChars; 
      pChar = new char[NumChars + 1]; 
     } 
     else; 
     NumChars = Str.NumChars; 
     strcpy(pChar, Str.pChar); 
    } 
    else; 
    return *this; 
} 

String& String::Copy(const char Str[]) 
{ 
    delete[] pChar; 
    NumChars = strlen(Str); 
    MaxSlots = NumChars; 
    pChar = new char[MaxSlots + 1]; 
    return *this; 
} 

String& String::Concat(const String & Str) 
{ 
    pTemp = new char[NumChars+1]; 
    strcpy(pTemp, pChar); 
    strcat(pTemp, Str.pChar); 
    delete[]pChar; 
    pChar = pTemp; 
    return *this; 
} 

String & String::Concat(const char Str[]) 
{ 
    return *this; 
    /* 
    NumChars = strlen(Str); 
    MaxSlots = NumChars; 


    delete[] pChar; 
    MaxSlots = MaxSlots + NumChars; 
    NumChars = NumChars + strlen(Str); 
    pChar = new char[MaxSlots + 1]; */ 
} 

void String::Display() const 
{ 
    cout << pChar; 
} 

void String::displayLine() const 
{ 
    cout << pChar; 
} 

#ifndef STRING_H 
#define STRING_H 

class String 
    { 
    public: 
        String(); //default constructor 
        String(const char[]); 
        String(const String &); //copy constructor 
        ~String(); 
     int   Compare(const String &) const; 
     int   Compare(const char[])const; 
     String&  Copy(const String&); 
     String&  Copy(const char[]); 
     String&  Concat(const String&); 
     String&  Concat(const char[]); 
     void  Display()const; 
     void  displayLine() const; 
     int   length() const; 

    private: 
     char * pChar; 
     char *pTemp; 
     int  NumChars; 
     int  MaxSlots; 
}; 

inline int String::length() const 
{ 
    return NumChars; 
}; 

#endif 
+3

を:[コードテストされていません注意]のようなもの文字列クラス?代わりにクラブに行く。 – Bathsheba

+0

'String&String :: Concat(const String&Str)'は、連結されているものが長さゼロの文字列でない限り、範囲外のアクセスを引き起こします。 – MikeCAT

+0

質問がありますか? – juanchopanza

答えて

0

私はあなたのMaxSlotsの使用を理解していません。割り当てられたサイズはpChar(マイナス1)ですか?その場合は、コードに設定/更新/使用することを忘れた箇所があります。

「どのようにStringクラスを渡すか」という意味は理解できませんが、「2つの文字列を連結するために必要なステップは何か」については、オブジェクトにすでに存在する文字の数。

まず、私はe Reserve()メソッドを作成することをお勧めします。

String& String::Reserve (int n) 
{ 
    if (n > MaxSlots) 
    { 
     MaxSlots = n; 
     pTemp = new char[MaxSlots+1]; 
     strcpy(pTemp, pChar); 
     delete[]pChar; 
     pChar = pTemp; 
    } 
} 

次に、このようにあなたのConcat()方法

String& String::Concat(const String & Str) 
{ 
    NumChars += Str.NumChars; 
    Reserve(NumChars); 
    strcat(pChar, Str.pChar); 
    return *this; 
} 

String & String::Concat(const char * Str) 
{ 
    if (Str) 
    { 
     NumChars += strlen(Str); 
     Reserve(NumChars); 
     strcat(pChar, Str); 
    } 
    return *this; 
} 

psの書き換え:なぜフォークはまだ建物命を無駄にしている私の悪い英語のため申し訳ありません

+0

Hmは、私がそれを実行するときに動作しません、私のコードと同じことをしました、ちょうどそれがメインのコンカットに達したときに停止しました....私はまだ混乱しています:( – Jonathon

+0

@Jonathon - あなたは '結果? – max66

1

あなたが連結された文字列の長さがあることを期待2つの文字列の長さの合計したがって:

String& String::Concat(const String & Str) 
{ 
    pTemp = new char[NumChars + Str.NumChars + 1]; 
    strcpy(pTemp, pChar); 
    strcat(pTemp, Str.pChar); 
    delete[]pChar; 
    pChar = pTemp; 
    return *this; 
} 

あなたは)(ないstrcatのことで、これをさらに最適化することができます - )(INGのが、strcpyの - (オフセットPTEMP二時間に加算して)二回INGの、あなたはすでに文字列の長さを知っています。

関連する問題