Сложный вопрос о строке: проблема с отображением индексов всех вхождений подстроки в строке (C ++) - PullRequest
0 голосов
/ 01 ноября 2019

То, что я должен сделать, просто, но мой код не работает из-за какой-то ошибки, которую я не могу понять:

  1. Проверьте 0 проиндексированный (первый) элемент входной строкии решить, будет ли это строка, в которой я собираюсь искать, т.е. исходная строка, или строка, которую я буду искать, т.е. строка поиска. Я буду обозначать их как SourceString и SearchString, соответственно. Пока ввод недопустим, программа должна попросить меня повторно ввести строковое значение

  2. Если индексированный элемент 0 входной строки равен 3, программа должна завершиться.

  3. Если индексированный элемент 0 входной строки равен 1, я должен проверить оставшуюся часть строки (то есть все остальные элементы строки за исключением первогои второй элемент, поскольку второй элемент является интервалом), чтобы увидеть, содержит ли он какие-либо нежелательные (недопустимые) символы, а именно: все, кроме строчных букв от a до z, в частности, строка НЕ ​​должна содержать цифр или вопросительных знаков. Также строка не должна быть пустой. Если какое-либо из этих условий не выполнено, программа попросит меня повторно ввести данные. И снова выполните все эти проверки. Если эти проверки выполнены, то я присваиваю значение входной строки новой строковой переменной, которую я называю SourceString (это «источник», в котором я собираюсь искать SearchString).

  4. Если индексированный элемент 0 входной строки равен 2, то я должен выполнить проверку остальной части строки (то есть всех других элементов строки, за исключением первого и второго элемента, посколькувторым элементом является интервал). Остальная часть строки НЕ должна быть пустой и должна состоять только из строчных букв от a до z. Он может содержать вопросительные знаки, но он не должен состоять только из вопросительных знаков. Если какой-либо из них не удовлетворен, программа должна попросить меня повторно ввести ввод, пока я не сделаю это правильно. Когда / если все эти условия выполнены, я обозначаю входную строку как строку поиска и вызываю новую переменную SearchString. Затем я ищу SearchString в SourceString и печатаю индексы всех вхождений SearchString, которые я нашел в SourceString.

  5. Эти шаги повторяются до тех пор, пока я не введу 3 в качестве входной строки, затем программа завершится.

Вы можете проверить следующий пример, чтобы получить более четкое представление о том, что должна делать программа:

This program searches a search string in a source string with the option of wildcards.

Example inputs with their meaning in parantheses:

1 thislectureisawesome (to enter a new source string)
2 lecture (to enter a new source string)
2 t?r? (to enter a source string with wildcards)
3 (to exit the program)

Enter your choice and string: 1 changingthesourcestring
Source word has been changed to "changingthesourcestring"

Enter your choice and string: 2 the 
For the source word "changingthesourcestring" and search word "the",
"the" has been found at index 8

Enter your choice and string: 2 ing
For the source word "changingthesourcestring" and search word "ing",
"ing" has been found at index 5
"ing" has been found at index 20

Enter your choice and string: 2 i?g
For the source word "changingthesourcestring" and search word "i?g",
"ing" has been found at index 5
"ing" has been found at index 20

Enter your choice and string: 2 is
For the source word "changingthesourcestring" and search word "is", no match has been found.

Enter your choice and string: 2 ?es
For the source word "changingthesourcestring" and search word "?es",
"hes" has been found at index 9
"ces" has been found at index 15

Enter your choice and string: 2 ?e?
For the source word "changingthesourcestring" and search word "?e?",
"hes" has been found at index 9
"ces" has been found at index 15

Enter your choice and string: 3
Bye!

Мой код следующий:

#include <iostream>
#include <string>
using namespace std; 

void CheckNumber(string InputString)  
{
    while(InputString.at(0) != '1' && InputString.at(0) != '2' && InputString.at(0) != '3')
    {
        cout << "Choice can be 1, 2 or 3! Try again." << endl;
        cout << endl;
        cout << "Enter your choice and string: ";
        getline(cin, InputString);
    }
    if(InputString.at(0) == '3')
        cout << "Bye!" << endl;
}

// Checks if the search string is a substring of the source string
int CheckSubstring(string SourceString, string SearchString) 
{ 
    SourceString = SourceString.substr(2,SourceString.length());
    int SourceStringLength = SourceString.length(); 
    int SearchStringLength = SearchString.length(); 
    int LengthDifference = SourceStringLength - SearchStringLength;

    /* A loop to slide pat[] one by one */
    for (int i = 0; i <= LengthDifference; i++) { 
        int j; 

        /* For current index i, check for pattern match */
        for (j = 0; j < SearchStringLength; j++) 
            if (SourceString[i + j] != SearchString[j]) 
                break; 

        if (j == SearchStringLength) 
            return i; 
    } 

    return -1; 
} 

/* Driver program to test above function */
int main() 
{ 
    string InputString;
    string SourceString; 
    string SearchString;
    cout << "Enter your choice and string: ";
    getline(cin, InputString);
    CheckNumber(InputString);

    while(InputString.at(0) == '1' || InputString.at(0) == '2')
    {
        int LengthInputString = InputString.length();
        int LengthInputWord = LengthInputString - 2;
        if(InputString.at(0) == '1')
        {
            int CountValid = 0;
            InputString = InputString.substr(2,LengthInputWord);
            if(InputString == "")
            {
                cout << "Wrong input format! Try again." << endl;
                cout << endl;
                cout << "Enter your choice and string: ";
                getline(cin, InputString);
                CheckNumber(InputString);
            }
            for(int i = 1; i <= InputString.length(); i++)
            {
                char c = InputString.at(i);
                if(c >= 'a' && c <= 'z')
                {
                    CountValid ++;
                }
            }
            if(CountValid == InputString.length())
            {
                SourceString = InputString;
                cout << "Source word has been changed to \"" << SourceString << "\""  << endl;
            }
            else
            {
                cout << "Wrong input format! Try again." << endl;
                cout << endl;
                cout << "Enter your choice and string: ";
            }
        }
        if(InputString.at(0) == '2')
        {
            int result = CheckSubstring(SourceString, SearchString); 
            if (result == -1) 
                cout << "For the source word \"" << SourceString << "\" and search word \"" << SearchString << "\", no match has been found." << endl;
            else
                cout << "For the source word \"" << SourceString << "\" and search word \"" << SearchString << "\", no match has been found." << result << endl;
        }
    }

    cin.get();
    cin.ignore();
    return 0; 
}

Единственное, что работает, - это строка ввода 3 и недопустимые строки ввода: когда я выбираю 3 в качестве ввода, программа отображает «Пока» и завершает работу, и если я ввожу неверный ввод (то есть строку, которая не имеет1 или 2 или 3 в качестве первого элемента) программа просит меня повторно ввести строку, пока я не получу ее правильную.

Проблема с 1 и 2. Всякий раз, когда я выбираю «1 бла» в качестве входной строки,Я получаю странную ошибку, которая говорит: «Необработанное исключение в 0x74E93572 в hw3try3.exe: исключение Microsoft C ++: std :: out_of_range в расположении памяти 0x008FF35C». Я понятия не имею, что я делаю неправильно. Кто-нибудь, пожалуйста, просветите меня. Буду вечно благодарен.

...