2012-06-15 3 views
0

MyString :: Найти, что находит строку в более крупной строке и возвращает начальную позицию подстроки. Обратите внимание, что ваше местоположение строки начинается с 0 и заканчивается длиной -1. Если строка не найдена, возвращается значение -1.Обработка ошибок подстроки и поиска

MyString :: Подстрока (начало, длина). Этот метод возвращает подстроку исходной строки, которая содержит те же символы, что и исходная строка, начинающаяся с начала местоположения и до тех пор, как длина.

Мои функции в файле .cpp являются:

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


    while(start != '\0') 
    { 
      for(int i = start; i < length+1; i++) 
      { 
        sub[i] = String[i]; 
      } 
    } 
    return MyString(sub); 
} 


const int MyString::Find(const MyString& other) 
{ 
    int start(0); 

    int counter(0); 

    int end = other.Size; 

    int end1 = Size; 

    int nfound = -1; 

    if(end > end1) 
    { 
      return nfound; 
    } 
    int i = 0, j = 0; 
    for(i = 0; i < end1; i++) 
    { 
      for(j = 0; j < end; j++) 
      { 
        if(((i+j) >= end1) || (String[i+j] != other.String[j])) 
        { 
          break; 
        } 




      } 
      if(j == end) 
      { 
        return i; 
      } 




    } 

    return nfound; 

    } 

Вызывающий функций в файле main.cpp являются:

 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 poisition of the hit: " << SearchString.Find(TargetString) << endl; 
     cout << "The matching substring is: " << SearchString.Substring(SearchString.Find(TargetString), TargetString.Length()); 
} 

После компиляции и побежал, я получаю:

Введите две строки. Каждая строка должна быть короче 256 символов или завершена/ . Будет найдена первая строка, чтобы увидеть, содержит ли она ровно вторую строку.

найти

в

в находится в найти

Подробной информации о хите:

Начиная poisition хита: 1 ^ C

Я в конечном итоге, прервите программу с помощью элемента управления C, но я уверен, что с моим кодом что-то не так, что я просто не вижу. Помоги пожалуйста! Что я делаю не так?

+0

Я думаю, вы опустили много деталей. – user845279

ответ

0

Проблема заключается в методе подстроки. Вы используете цикл while, который продолжается навсегда. Возможно, вы ищете что-то вроде фрагмента ниже.

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

    for(int i = start; i < length+1; i++) 
    { 
     sub[i] = String[i]; 
    } 

    return MyString(sub); 
} 
+0

Ha! Это помогло! Спасибо, я не знаю, как я это пропустил! Теперь, когда я запускаю его, он выглядит следующим образом: «Подходящая подстрока: ðäZ», которая для меня такова, любые мысли? – user1363061

+0

Мой C++ довольно ржавый, но я думаю, что вам не хватает ключевого слова 'new' перед оператором return. Это должно быть 'return new MyString (sub);'. Согласно быстрому поиску Google, без ключевого слова 'new' конструктор не вызывается. Это приведет к тому, что содержимое возвращаемой MyString.String будет случайным, а не данными в 'sub'. –

+0

Aha! Спасибо вам за это! Кроме того, у меня не должно быть утечек памяти, так что мне любопытно, не вызовет ли это что-нибудь? Я не удаляю нигде в функции, но было сумасшествовать, чтобы удалить его, а затем попытаться вернуть его. Я просто смущен этим – user1363061

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