我正在使用Microsoft Visual C ++ 2010 Express。运行我的代码调试会导致以下错误:
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 ==========
我基本上试图通过使用一个大小等于从" input.txt"传递到函数中的单词的字符串长度的布尔数组来创建单词unscrambler。文件。然后将其与" wordlist.txt"进行比较。匹配字符的内容。
比较字符串和成功匹配的字符串应通过控制台窗口显示,并导出到" output.txt"。
我已经放置了" wordlist"和"输入"工作目录中的文本文件(即与.vc ++ proj文件相同),但从调试失败判断,我不认为ifstream正在访问这些文本文件。
以下是代码:
#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 :(得分:1)
这不是合法的C ++:
int scramlen = scram.length();
//...
bool match[scramlen];
string used[scramlen];
C ++中的数组必须使用编译时常量来表示条目数,而不是变量。此语法可能适用于支持可变长度数组(VLA&#39)的编译器,但这是编译器扩展,因此是非标准的。
此扩展程序由g++
等编译器支持,但它不,并且从未得到Visual C ++系列编译器的支持(并且不需要支持它,同样,以这种方式声明数组也不是合法的C ++。
无论如何,即使编译器确实支持VLA,我也会建议不要使用VLA。相反,如果您想拥有动态数组,请使用std::vector
。它是标准的C ++(因此适用于所有编译器),并为您提供诸如检查数组边界(使用vector::at()
),VLA不能做的事情等好处。
#include <vector>
//...
std::vector<bool> match(scramlen); // See item below
std::vector<string> used(scramlen);
此外,在非指针类型上发出delete []
调用时出错。删除这一行:
delete [] match;
答案 1 :(得分: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;
}
修改:
通过阅读评论,看起来我在一件事情上感到困惑。您无法使用变量初始化数组,原因如下:Array[n] vs Array[10] - Initializing array with variable vs real number。您将需要一个常量整数。然而,使用std::vector
是解决方案。