2015-04-09 4 views
-1

В моей программе у меня есть текстовый файл, который считывается в массив, который токенизирует каждое слово. Мне нужно это так, чтобы я мог сравнивать слова с словами, найденными в моем двоичном дереве. Проблема в том, что ... некоторые дубликаты слов не отформатированы одинаково (один имеет верхний регистр, а один - строчный), и мне нужно, чтобы они были найдены в моем двоичном дереве.Изменить String Array tolower

Итак, мой вопрос: как мне изменить весь массив на нижний регистр?

Вот что я пытался до сих пор:

#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(); 

} 
+1

Я удалил ваш излишний поток сообщений об ошибках, поскольку их причины уже объяснены ниже. Пожалуйста, внимательно прочитайте ответ и комментарии. –

ответ

3

С C++ 11 и более поздних версий, вы можете downcase массив строк, как это:

#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 expects. (См. this question для обсуждения.) Многие функции CI/O выражаются в терминах unsigned char -converted-to- int, так как обычно int является достаточно большим, чтобы представлять все значения unsigned char плюс дополнительную внеполосную информацию и char и unsigned char являются конвертируемыми в обе стороны, а также совместимыми с макетами.

+0

[Demo] (http://ideone.com/fkzFQ7) –

+1

@ narue1992 Последняя версия (обновленная!) Должна работать для всех компиляторов. В остальном вам необходимо включить поддержку C++ 11. Это невозможно для всех компиляторов, для gcc и clang вы можете сделать это с помощью '-std = C++ 11' (или' -std = C++ 0x', если ваш компилятор является полу-древним). –

+1

@ narue1992 Я думаю, что эта неопределенная дискуссия в комментариях достаточно длинная. Решения Kerrek верны, если вы не можете заставить их работать, задайте новый вопрос, включая [SSCCE] (http://www.sscce.org), чтобы люди действительно могли видеть, что вы делаете неправильно. –