В моей программе у меня есть текстовый файл, который читается в массив, который маркирует каждое слово. Мне нужно это таким образом, чтобы я мог сравнить слова со словами, найденными в моем двоичном дереве. Проблема в том, что некоторые дубликаты слов не форматируются одинаково (одно прописное, а другое строчное), и мне нужно, чтобы они были найдены в моем двоичном дереве.
Итак, мой вопрос: как мне поменять весь массив на строчные?
Вот что я попробовал до сих пор:
#include <iostream>
#include "Binary_SearchTree.h"#include "Node.h"#include <string>
#include <fstream>
#include <sstream>
using namespace std;
const int SIZE = 100;
string myArray[SIZE];
int main() {
// first constructor will be used since it is empty
Binary_SearchTree<string> *tree = new Binary_SearchTree<string>();
string token, lines;
ifstream file("hashtags.txt");
while (getline(file, lines)){
tree -> insertNode(lines);
}
// Convert all strings in myArray to all-lower
myArray = tolower(myArray);
// tokenize tweet into an array to search
ifstream tweet1("exampleTweet.txt");
if(tweet1.is_open())
{
while (getline(tweet1, token)){
for(int i = 0; i < SIZE; ++i)
{
tweet1 >> myArray[i];
}
}
tweet1.close();
}
В C ++ 11 и более поздних версиях вы можете уменьшить массив строк следующим образом:
#include <algorithm>
#include <cctype>
#include <string>
std::string myArray[23];
// ...
for (std::string & s : myArray)
std::transform(s.begin(), s.end(), s.begin(),
[](unsigned char c) { return std::tolower(c); });
В качестве альтернативы:
for (std::string & s : myArray)
std::for_each(s.begin(), s.end(), [](char & c) {
c = std::tolower(static_cast<unsigned char>(c)); });
Или даже:
for (std::string & s : myArray)
for (char & c : s)
c = std::tolower(static_cast<unsigned char>(c));
Если у вас есть только поддержка C ++ 98, используйте следующие циклы:
for (std::size_t i = 0; i != 23; ++i)
{
std::string & s = myArray[i];
for (std::string::iterator it = s.begin(), e = s.end(); it != e; ++it)
{
*it = std::tolower(static_cast<unsigned char>(*it));
}
}
Вы поняли идею.
Не забудьте преобразовать персонажа в unsigned char
, поскольку это то, что std::tolower
надеется. (Увидеть этот вопрос для обсуждения.) Многие функции ввода / вывода C выражаются в терминах unsigned char
-конвертировано в-int
, так как обычно int
достаточно велик, чтобы представлять все значения unsigned char
плюс дополнительная внеполосная информация, и char
а также unsigned char
конвертируемы в обе стороны и совместимы с макетом.