То, что я должен сделать, просто, но мой код не работает из-за какой-то ошибки, которую я не могу понять:
Проверьте 0 проиндексированный (первый) элемент входной строкии решить, будет ли это строка, в которой я собираюсь искать, т.е. исходная строка, или строка, которую я буду искать, т.е. строка поиска. Я буду обозначать их как SourceString и SearchString, соответственно. Пока ввод недопустим, программа должна попросить меня повторно ввести строковое значение
Если индексированный элемент 0 входной строки равен 3, программа должна завершиться.
Если индексированный элемент 0 входной строки равен 1, я должен проверить оставшуюся часть строки (то есть все остальные элементы строки за исключением первогои второй элемент, поскольку второй элемент является интервалом), чтобы увидеть, содержит ли он какие-либо нежелательные (недопустимые) символы, а именно: все, кроме строчных букв от a до z, в частности, строка НЕ должна содержать цифр или вопросительных знаков. Также строка не должна быть пустой. Если какое-либо из этих условий не выполнено, программа попросит меня повторно ввести данные. И снова выполните все эти проверки. Если эти проверки выполнены, то я присваиваю значение входной строки новой строковой переменной, которую я называю SourceString (это «источник», в котором я собираюсь искать SearchString).
Если индексированный элемент 0 входной строки равен 2, то я должен выполнить проверку остальной части строки (то есть всех других элементов строки, за исключением первого и второго элемента, посколькувторым элементом является интервал). Остальная часть строки НЕ должна быть пустой и должна состоять только из строчных букв от a до z. Он может содержать вопросительные знаки, но он не должен состоять только из вопросительных знаков. Если какой-либо из них не удовлетворен, программа должна попросить меня повторно ввести ввод, пока я не сделаю это правильно. Когда / если все эти условия выполнены, я обозначаю входную строку как строку поиска и вызываю новую переменную SearchString. Затем я ищу SearchString в SourceString и печатаю индексы всех вхождений SearchString, которые я нашел в SourceString.
Эти шаги повторяются до тех пор, пока я не введу 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». Я понятия не имею, что я делаю неправильно. Кто-нибудь, пожалуйста, просветите меня. Буду вечно благодарен.