-1

SO 部分文字列の開始位置とその長さを取得する部分文字列関数があります。これにより、文字列関数を実際に使用せずに、文字列を抽出して文字列として返す必要があります。

//default constructor that sets the initial string to the value "Hello World"
MyString::MyString()
{
    char temp[] = "Hello World";

    int counter(0);
    while(temp[counter] != '\0')
    {
            counter++;
    }
    Size = counter;
    String = new char [Size];
    for(int i=0; i < Size; i++)
            String[i] = temp[i];
 }

  //copy constructor
  MyString::MyString(const MyString &source)
 {

    int counter(0);
    while(source.String[counter] != '\0')
    {
            counter++;
    }
    Size = counter;
    String = new char[Size];
    for(int i = 0; i < Size; i++)
            String[i] = source.String[i];

 }

ここに私の部分文字列関数があります:

MyString MyString::Substring(int start, int length)
{
 char* leo = new char[length+1];
    for(int i = start; i < start + length+ 1; ++i)
    {
            leo[i-start] = String[i];
    }

    MyString sub;
    delete [] sub.String;
    sub.String = leo;
    sub.Size = length+1;
    return sub;

}

main.cpp ファイルの次のコードを使用します。

  int main (int argc, char **argv)
 {
   MyString String1; // String1 must be defined within the scope

  const MyString ConstString("Target string");      //Test of alternate constructor 

 MyString SearchString;  //Test of default constructor that should set "Hello World". 

  MyString TargetString (String1); //Test of copy constructor


 cout << "Please enter two strings. ";

 cout << "Each string needs to be shorter than 256 characters or terminated by /\n." << endl;

 cout << "The first string will be searched to see whether it contains exactly the second string. " << endl;

cin >> SearchString >> TargetString; // Test of cascaded string-extraction operator


  if(SearchString.Find(TargetString) == -1) {

   cout << TargetString << " is not in " << SearchString << endl;
  }

   else {

   cout << TargetString << " is in " << SearchString << endl;

    cout << "Details of the hit: " << endl;

    cout << "Starting position of the hit: " << SearchString.Find(TargetString) << endl;

    cout << "The matching substring is: " << SearchString.Substring(SearchString.Find(TargetString), TargetString.Length()-1)<<"\n";
  }

戻り値:

文字列を 2 つ入力してください。各文字列は 256 文字未満にするか、 / で終了する必要があります。最初の文字列が検索され、2 番目の文字列が正確に含まれているかどうかが確認されます。

永遠に

もっと

もっと見る 世界は永遠ではない

余分な文字なしでユーザー入力から単語を実際に出力しない理由について何か考えはありますか? 道に迷いました。

4

3 に答える 3

2
for(int i = start; i < length+1; i++)

これはあなたが望むようには機能していません。そのはず:

for (int i = start; i < start + length; ++i)

off-by-one エラーがあり、それが何を言っているのかを理解すると、終了条件が意味をなしません。

インデックス 2 から始まる長さ 5 の部分文字列を取得します。コピーされる文字は、条件に適合するインデックス 2 から 6 にあります。

ただし、内部には別の問題があります。0 から始まらない限りi、適切な配列インデックスにコピーしていません。そのはず:

sub [i - start] = String [i];

subそうすれば、インデックス 0から塗りつぶしを開始できます。

また、完了したら、null で終了する必要があります。

sub [length] = '\0';

そうすれば最後まで走りません。

于 2012-06-16T23:04:14.750 に答える
1

std::copy次のアルゴリズムの使用を検討してください。

MyString MyString::Substring(int start, int length)
{
    char* sub;
    sub = new char[length + 1];
    sub[length] = '\0';

    std::copy(String + start, String + start + length, sub);
    return MyString(sub);
}

(これはオブジェクトのデータ メンバーでStringあると想定しています。)char *MyString

于 2012-06-16T23:12:06.263 に答える
0
MyString MyString::Substring(int start, int length)
{
    char* sub;
    sub = new char[length+1];
    sub[length] = '\0';
    int j = 0;
    for(int i = start; i < start + length; ++i)
    {
        sub[j] = String[i];
        ++j;
    }
    return MyString(sub);
}

このようなもの。

于 2012-06-16T23:06:16.713 に答える