2016-08-12 2 views
1

Я использую Microsoft Visual C++ 2010 Express. Запуск отладки моих результатов коды в следующих ошибках:C++ - Получение значений из текстового файла в массив для сравнения

1>------ Build started: Project: Word Unscrambler, Configuration: Debug Win32 ------ 
1> word unscrambler.cpp 
1>c:\users\c m j richards\documents\visual studio 2010\projects\word unscrambler\word unscrambler\word unscrambler.cpp(22): error C2057: expected constant expression 
1>c:\users\c m j richards\documents\visual studio 2010\projects\word unscrambler\word unscrambler\word unscrambler.cpp(22): error C2466: cannot allocate an array of constant size 0 
1>c:\users\c m j richards\documents\visual studio 2010\projects\word unscrambler\word unscrambler\word unscrambler.cpp(22): error C2133: 'match' : unknown size 
1>c:\users\c m j richards\documents\visual studio 2010\projects\word unscrambler\word unscrambler\word unscrambler.cpp(23): error C2057: expected constant expression 
1>c:\users\c m j richards\documents\visual studio 2010\projects\word unscrambler\word unscrambler\word unscrambler.cpp(23): error C2466: cannot allocate an array of constant size 0 
1>c:\users\c m j richards\documents\visual studio 2010\projects\word unscrambler\word unscrambler\word unscrambler.cpp(23): error C2133: 'used' : unknown size 
1>c:\users\c m j richards\documents\visual studio 2010\projects\word unscrambler\word unscrambler\word unscrambler.cpp(59): warning C4154: deletion of an array expression; conversion to pointer supplied 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Я по существу пытаюсь создать слово Unscrambler, используя булеву массив размера, равную длину строки слова, передаваемую в функцию из "input.txt". Затем это сравнивается с содержимым «wordlist.txt» для сопоставления символов.

Сравнимые строки, а также те, которые были успешно сопоставлены, должны отображаться через окно консоли и экспортироваться в «output.txt».

Я поместил текстовые файлы «wordlist» и «input» в рабочий каталог (то есть то же, что и файл .vC++ proj), но, судя по неудачному отладке, я не думаю, что ifstream получает доступ к этим текстам файлы.

Вот скриншот IDE: enter image description here

А вот код:

#include<string> 
#include<cstdio> 
#include<iostream> 
#include<fstream> 

using namespace std; 

string unscramble(string scram) 
{ 
    int scramlen = scram.length(); 
    int i = 0; 

    string word; 
    ifstream file("wordlist.txt"); 
    if (file.is_open()) 
    { 
     while (file.good()) 
     { 
      getline(file,word); 
      if (scramlen == word.length()) 
      { 
       bool match[scramlen]; 
       string used[scramlen]; 
       int matchcount = 0; 

       for (int x = 0; x < scramlen; x++) 
       { 
        string lttrscram = scram.substr(x,1); 

        for (int y = 0; y < scramlen; y++) 
        { 
         string lttrunscram = word.substr(y,1); 

         if (lttrscram == lttrunscram) 
         { 
          if (used[y] == lttrscram) match[matchcount] = false; 

          else 
          { 
           used[y] = lttrscram; 
           match[matchcount] = true; 
           matchcount++; 
           break; 
          } 
         } 
        } 
       } 

       i = 0; 
       for (int j = 0; j < scramlen; j++) 
       { 
        if (match[j] == true) i++; 
       } 
       if (i == scramlen) 
       { 
        cout <<"Match found: " << word << endl; 
        return word; 
       } 
       delete [] match; 
      } 
     } 
     file.close(); 
    } 
} 

int main() 
{ 
    string inputkey[10]; 
    string outputkey[10]; 
    int wordnum = 0; 

    int count = 0; 
    string wordtemp; 
    ifstream file("input.txt"); 
    if (file.is_open()) 
    { 
     while (file.good()); 
     { 
      getline (file,wordtemp); 
      inputkey[count] = wordtemp; 
      count++; 
     } 
     file.close(); 
    } 

    for (int i = 0; i < 10; i++) 
    { 
     wordnum++; 
     cout <<"#" << wordnum << " Comparing: " << inputkey[i] << endl; 
     outputkey[i] = unscramble(inputkey[i]); 
    } 

    ofstream output; 
    output.open("output.txt"); 

    for (int j = 0; j < 10; j++) 
    { 
     if (j == 9) output << outputkey[j]; 
     else output << outputkey[j] << ", "; 
    } 
    output.close(); 

    system("pause"); 
    return 0; 
} 

ответ

0

Ваша проблема заключается в том, что scramlen не инициализирован. Таким образом, bool match[scramlen]; и string used[scramlen]; не позволят вам скомпилировать.

Рассмотрите возможность использования std::vector из библиотеки #include <vector> вместо array. Вы сможете получить доступ к элементам точно так же, как массивы, но динамически изменять размер. И использование является рутинным похожее на это:

int scramlen = scram.length(); 
std::vector<bool> match(scramlen); 
std::vector<int> used(scramlen); 

// .. 

else 
{ 
    used[y] = lttrscram; 
    match[matchcount] = true; 
    matchcount++; 
    break; 
} 

Edit:

От прочтения комментариев, похоже, я запуталась в одном. Вы не можете инициализировать массив переменной, и вот почему: Array[n] vs Array[10] - Initializing array with variable vs real number. Вам понадобится константа целое число. Однако использование решения std::vector.

+0

Причина ошибки компиляции не имеет ничего общего с инициализацией переменной. – PaulMcKenzie

+0

Я прочитал ваш ответ, и я ничего не узнал. Не могли бы вы рассказать мне, в чем причина? –

+0

Что не понято в моем ответе? Это совершенно ясно - ОП пытается объявить массив, используя переменную как количество элементов. Это не законный C++. Вы утверждали, что причина в том, что 'scramlen' не был инициализирован - это явно ложно. Неважно, было ли это или не было инициализировано, вы не можете объявлять массивы с использованием переменной в виде количества элементов. – PaulMcKenzie

1

Это не юридический C++:

int scramlen = scram.length(); 
//... 
bool match[scramlen]; 
string used[scramlen]; 

Массивы в C++ необходимо использовать во время компиляции константы для обозначения числа записей, а не переменная. Этот синтаксис может работать с компилятором, который поддерживает Variable Length Arrays (VLA), но это расширение компилятора и, следовательно, является нестандартным.

Это расширение поддерживается компиляторами, таких как g++, но это не и никогда не поддерживается Visual C++ серии трансляторов (и нет никакой необходимости поддерживать его, как и опять же, это не законно C++ чтобы таким образом были объявлены массивы).

В любом случае, я бы посоветовал использовать VLA, даже если компилятор их поддерживал. Вместо этого, если вы хотите иметь динамический массив, используйте std::vector. Он является стандартным C++ (таким образом, он будет работать со всеми компиляторами) и дает вам преимущества, такие как проверка границ массива (с использованием vector::at()), что не может сделать VLA.

#include <vector> 
//... 
std::vector<bool> match(scramlen); // See item below 
std::vector<string> used(scramlen); 

Кроме того, вы делаете ошибку, выдающее delete [] вызов типа, не указатель. Удалите эту строку:

+0

Большое спасибо. Я не знал о классе векторов в стандартной библиотеке, и теперь я понимаю ошибку, которую я получал во время компиляции. Я соответствующим образом адаптировал свой код, и теперь он компилируется без проблем ... но я столкнулся с другой ошибкой! :(Я попробую сам это сделать. Еще раз спасибо !!! :) –

Смежные вопросы