在C ++中从.txt文件中查找垂直词

时间:2019-02-11 05:03:41

标签: c++ arrays

我正在做一个小项目,我正在尝试将.txt文件中的一组字母(5行,5列)放入数组中,然后找到垂直单词“ DOG”。我不仅必须找到它,而且还必须确定单词的位置。我很难完成它。

1)无论我是否带出“狗”一词都没有关系。我的代码仍然说找到了单词。

2)如果我将“狗”一词移到拼图上的另一个位置,它将始终显示相同的位置。

3)根本不起作用...

任何人都可以帮忙吗?

请记住,这是我C ++的第二周。我目前正在使用该语言进行大学入门课程,所以不要讨厌。我只是想学习。我大概花了12个小时在这段代码上。

#include <iostream>
#include <fstream>

using namespace std;

int main() {
  char puzzle[25];
  ifstream fin;
  fin.open("words.txt");

  int rows {5};
  int cols {5};

  for (int i=0;i<rows*cols;i++) fin >> puzzle[i];
  fin.close();

/***********
 This is what I believe the array looks like and the values of each position.

 * 0   1   2  3   4
 * 5   6   7  8   9
 * 10  11  D  13  14
 * 15  16  O  18  19
 * 20  21  G  23  24
************/

string s = "DOG";
cout << s.size() << endl;
int foundpos {-1};

for (int i=0; i<rows*cols; i++) {
  if (puzzle[i]==s[0]) {
        foundpos=i;
        for (int j=5; j<s.size(); j+5) {
          if (puzzle[i+j]!=s[j]) {
                foundpos=-1;
                break;
          }
        }
 }

     if (foundpos>0) {
        cout << s << " was found at pos " << foundpos << endl;
        cout << s << " found on row " << foundpos << endl;
        cout << s << " found on column " << foundpos << endl;
        break;
     }
 }

 if (foundpos==-1) cout << s << " not found." << endl;

 return 0;
}

================================================ ================

现在是.txt文件。

YRUVG RTSDC IFDYU 埃波威 PWGHT

2 个答案:

答案 0 :(得分:0)

您的问题在这里:

kill()

您的想法:当您得到给定字符串的第一个字母时,您尝试检查同一列的下一个字母是否与给定字符串的下一个字母相同。但是,您从5开始运行循环,请注意for (int j=5; j<s.size(); j+5) { if (puzzle[i+j]!=s[j]) { foundpos=-1; break; } } ,因此循环不会运行。然后,s.size() = 3未设置为foundpos。这就是为什么您总是在打印日志中看到-1的原因。

修复:

8

答案 1 :(得分:0)

您还需要解决一些其他警告,但我无法在评论中添加这些警告。由于您正在将所有字符读入要表示为2D数组的单个数组中,因此需要将puzzle[i][j]索引为puzzle[i + j * STRIDE]

主要方法是遍历每个字符,puzzle检查您搜索词中的第一个字符是否为当前字符。如果是,请检查:

  1. irows*col之间是否留有足够的字符以使其余搜索词存在于一列中?如果没有,您可以断定找不到您的字符串;
  2. 如果剩余足够的字符,请设置一个found = true标志,并在您的搜索项中剩余的字符上循环(例如,从j = 1term.size()),检查{ {1}}如果找到不匹配的术语,则设置puzzle[i + j * STRIDE] != term[j]并中断术语循环;和
  3. 最后检查found = false鞭log。如果此时它仍以found的形式保存下来,则说明已找到您的搜索词,您只需输出搜索词的索引并返回。

例如,将其作为一个简短示例,您可以执行以下操作:

found == true

示例输入文件

#include <iostream>
#include <fstream>
#include <string>
#include <cctype>   /* for isspace() */

#define STRIDE 5    /* define const for stride */

int main (int argc, char **argv) {

    char puzzle [STRIDE*STRIDE] = {0}, c;   /* puzzle and char */
    size_t psize = STRIDE*STRIDE, n = 0;    /* puzzle size & char count */
    std::string fname = argv[1],            /* filename */
                term = argc > 2 ? argv[2] : "DOG";  /* search term */
    std::ifstream f;    /* file stream */

    if (argc < 2) { /* validate at least filename given as arg */
        std::cerr << "error: insufficien input.\n"
                << "usage: " << argv[0] << "infile\n";
        return 1;
    }

    f.open (argv[1]);   /* open file */
    if (!f.is_open()) { /* validate file open for reading */
        perror (("error file open failed " + fname).c_str());
        return 1;
    }

    while (n < psize && f >> c) /* read file into puzzle */
        if (!isspace (c))
            puzzle[n++] = c;
    f.close();                  /* close file */

    if (n < psize) {    /* validate psize characters read */
        std::cerr << "error: only " << n << "characters read.\n";
        return 1;
    }

    for (size_t i = 0; i < psize; i++) {    /* loop over each char */
        if (puzzle[i] == term[0]) {         /* if matches 1st in term */
            size_t tlen = term.size(),      /* get term size */
                    found = 1;              /* set found flag true */
            if (i + (tlen - 1) * STRIDE >= psize)   /* enough chars left? */
                break;
            for (size_t j = 1; j < tlen; j++)   /* loop 1 to term len */
                if (puzzle[i + j * STRIDE] != term[j]) { /* next !found? */
                    found = 0;      /* set found flag false */
                    break;          /* break loop */
                }
            if (found) {    /* if found, output term & indexes, return */
                std::cout << "found " << term << " at indexes " << i;
                for (size_t j = 1; j < tlen; j++)
                    std::cout << ", " << i + j * STRIDE;
                std::cout << '\n';

                return 0;
            }
        }
    }

    /* only reachable if not found */
    std::cout << "'" << term << "' not found.\n";
    return 1;
}

使用/输出示例

$ cat dat/vertword.txt
YRUVG
RTSDC
IFDYU
EPOWE
PWGHT

仔细检查一下,如果还有其他问题,请告诉我。