Цель: Android / iOS приложение, которое отображает непростые слова, когда пользователь вводит букву.
Код работает правильно, за исключением не-Engli sh символов. Программа допускает некоторые нецензурные sh проклятия, когда пользователь вводит свое имя.
Ожидаемый результат: Программа отклонит все слова проклятия (в пределах nameCurseWordsList.txt)
Фактический результат: пропущены некоторые нецензурные слова sh.
Сообщения об ошибках: Нет
Попытка:
- Изменение ввода вектора и связанной переменной userFirstName на wstring.
- Проверяется, установлены ли для параметров VS2019 значение "Автоопределение кодировки UTF-8". без подписи "- уже включено.
- Изменена кодировка nameCurseWordsList.txt с" UTF-8 с спецификацией "на" UTF-8 ".
- Установите окно вывода cmd в VS2019 для использования шрифта Lucida Консоль.
- Как обрабатывать последовательности символов Юникода в C / C ++?
- Как моя программа может переключаться с ASCII на Unicode?
- Как отображать символы Юникода в Visual Studio?
Co de:
// Description: Android/iOS application that takes in a letter and displays tricky-to-spell words.
#include <iostream>
#include <fstream>
#include <locale>
#include <string>
#include <vector>
#include <limits>
#include <sstream>
#include "usingDeclarations.hpp"
vector <string> trickyWordsVector;
vector <wstring> nameCurseWordsVector;
void printWords(char userLetterInput);
void getTrickyWords();
void getNameCurseWords();
int main() {
cout << "----------------<>-----------\n";
cout << "Welcome to Your TRICKY WORDS Helper!\n";
cout << "----------------<>-----------\n";
wstring userFirstName;
size_t firstNameOnlyAlpha{};
bool isNameCurseWord = false;
do {
cout << "\nEnter your first name: ";
getline(wcin, userFirstName);
for (unsigned __int8 i = 1; i < userFirstName.length(); i++) {
if (userFirstName[i - 1] == ' ') {
userFirstName[i] = toupper(userFirstName[i]);
} else {
userFirstName[i] = tolower(userFirstName[i]);
}
}
userFirstName[0] = toupper(userFirstName[0]);
firstNameOnlyAlpha = userFirstName.find_first_of(L"0123456789`~!@#$%^&*()':'';''/'-_=+{}[]|:<>,.' '?'\t\"");
getNameCurseWords();
if (find(nameCurseWordsVector.begin(), nameCurseWordsVector.end(), userFirstName) != nameCurseWordsVector.end()) {
cout << "Curse word entered. Please freakin' try again.\n";
isNameCurseWord = true;
} else {
isNameCurseWord = false;
}
} while (isNameCurseWord || firstNameOnlyAlpha != string::npos || userFirstName.empty());
char userLetterInput;
char userChoiceContinue;
do {
do {
cout << "\nEnter a letter [a-z]: ";
cin >> userLetterInput;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
userLetterInput = toupper(userLetterInput);
if (isalpha(userLetterInput)) {
wcout << "\nHey " << userFirstName << ",\n\nHere's your list of tricky words for the letter (" << char(toupper(userLetterInput)) << "):\n" << endl;
}
} while (!isalpha(userLetterInput));
getTrickyWords();
printWords(userLetterInput);
do {
cout << "\nWould you like to enter another letter [y,n]?: ";
cin >> userChoiceContinue;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
} while (char(tolower(userChoiceContinue)) != 'y' && char(tolower(userChoiceContinue)) != 'n');
} while (char(tolower(userChoiceContinue)) == 'y');
cout << "\n----------------<>-----------\n";
cout << "Thank you for using Your TRICKY WORDS Helper!\n";
cout << "\n----------------<>-----------\n";
return 0;
} // end main()
void printWords(char userLetterInput) {
for (int i = 0; i < trickyWordsVector.size(); i++) {
if (trickyWordsVector[i][0] == userLetterInput) {
cout << trickyWordsVector[i];
cout << "\n";
}
}
} // end printWords()
void getTrickyWords() {
ifstream trickyWordsFile("trickyWordsList.txt");
if (trickyWordsFile.is_open()) {
if (trickyWordsVector.empty()) {
string line;
while (getline(trickyWordsFile, line)) {
if (line.size() > 0) {
trickyWordsVector.push_back(line);
}
}
}
}
else {
cerr << "Cannot open the file.";
}
trickyWordsFile.close();
} // end getTrickyWords()
void getNameCurseWords() {
wifstream nameCurseWordsFile("nameCurseWordsList.txt");
if (nameCurseWordsFile.is_open()) {
if (nameCurseWordsVector.empty()) {
wstring line;
while (getline(nameCurseWordsFile, line)) {
if (line.size() > 0) {
nameCurseWordsVector.push_back(line);
}
}
}
}
else {
cerr << "Cannot open the file, you sailor mouth. ;)";
}
nameCurseWordsFile.close();
} // end getNameCurseWords()
usingDeclarations.hpp
#pragma once
using std::cout;
using std::wcout;
using std::cin;
using std::wcin;
using std::cerr;
using std::getline;
using std::endl;
using std::use_facet;
using std::numeric_limits;
using std::streamsize;
using std::string;
using std::wstring;
using std::ifstream;
using std::wifstream;
using std::vector;
using std::locale;
using std::ctype;
trickyWordsList.txt или trickyWordsFile
Argument
Atheist
Axle
Bellwether
Broccoli
Bureau
Caribbean
Calendar
Camaraderie
Desiccate
Desperate
Deterrence
nameCurseWordsList.txt или nameCurseWordsFile (частичный список)
// Irish
RáIcleach
// German
ScheißKopf
// Russian
Oбосра́ться
Obosrat'sya
// Chinese
王八蛋
Hùn Zhàng
// Japanese
くそ
// Korean
아, 씨발
Спасибо за любые советы.
Запустите код, используя https://repl.it/~