0

出于某种原因,我的 searchPuzzle 函数中的打印语句不起作用。各位大佬能解释一下原因吗?我试图在 15x15 的填字游戏中找到某些单词。我试图找到的词是美国的州,例如纽约。char ** arr 代表填字游戏。而 char** 列表表示状态列表。我的功能是尝试在填字游戏中找到状态并打印出它确实找到的状态。Int listsize 的值为 50。而 n 的值为 15。

This is the cross word puzzle: WDBMJQDBCJNQPTI IRZUXUZEAOIORTN MNZPLRNHLYLXHMD MYEKAIDPIULYOWI AOABARKUFVIHLAA LONMRXKIOJNAVRN AEPTAARARTOWAIA SUCZAUSINAIALZV KOTAONRKISSIAON AHXSVKAIAEAIBNE UDSXNXCCDWGSAAV OISDWLEJNJTXMHA MOXWTNHQDXOQAQD RUUVGEORGIAQVDA VFLORIDALGLWOXN

这是州列表: 阿拉巴马 阿拉斯加 亚利桑那 阿肯色 加利福尼亚 科罗拉多 康涅狄格 特拉华 佛罗里达 乔治亚 夏威夷 爱达荷 伊利诺伊 印第安纳 爱荷华 堪萨斯 肯塔基 路易斯安那 缅因 马里兰 马萨诸塞 密歇根 明尼苏达 密西西比 密苏里 蒙大拿 内布拉斯加州 内华达 新罕布什尔 新泽西 新墨西哥 纽约 北卡罗来纳 北达科他 俄克拉荷马 俄勒冈 宾夕法尼亚 罗德岛 南卡罗来纳 南达科他 田纳西 德克萨斯犹他 佛蒙特 弗吉尼亚 华盛顿 西弗吉尼亚 威斯康星 怀俄明

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// DO NOT INCLUDE OTHER LIBRARY!

// Declarations of the two functions you will implement
// Feel free to declare any helper functions
void printPuzzle(char** arr, int n);
void searchPuzzle(char** arr, int n, char** list, int listSize);

// Main function, DO NOT MODIFY!!!  
int main(int argc, char **argv) {
  int bSize = 15;
  if (argc != 2) {
     fprintf(stderr, "Usage: %s <puzzle file name>\n", argv[0]);
     return 2;
  }
  int i, j;
  FILE *fptr;
  char **block = (char**)malloc(bSize * sizeof(char*));
  char **words = (char**)malloc(50 * sizeof(char*));

  // Open file for reading puzzle
  fptr = fopen(argv[1], "r");
  if (fptr == NULL) {
     printf("Cannot Open Puzzle File!\n");
     return 0;
  }

  // Read puzzle block into 2D arrays
  for(i=0; i<bSize; i++){
     *(block+i) = (char*)malloc(bSize * sizeof(char));

     fscanf(fptr, "%c %c %c %c %c %c %c %c %c %c %c %c %c %c %c\n", *(block+i), *(block+i)+1, *(block+i)+2, *(block+i)+3, *(block+i)+4, *(block+i)+5, *(block+i)+6, *(block+i)+7, *(block+i)+8, *(block+i)+9, *(block+i)+10, *(block+i)+11, *(block+i)+12, *(block+i)+13, *(block+i)+14 );
  }
  fclose(fptr);

  // Open file for reading word list
  fptr = fopen("states.txt", "r");
  if (fptr == NULL) {
     printf("Cannot Open Words File!\n");
     return 0;
  }

  // Save words into arrays
  for(i=0; i<50; i++){
     *(words+i) = (char*)malloc(20 * sizeof(char));
     fgets(*(words+i), 20, fptr);       
  }

  // Remove newline characters from each word (except for the last word)
  for(i=0; i<49; i++){
     *(*(words+i) + strlen(*(words+i))-2) = '\0';   
  }

  // Print out word list
  printf("Printing list of words:\n");
  for(i=0; i<50; i++){
     printf("%s\n", *(words + i));      
  }
  printf("\n");

  // Print out original puzzle grid
  printf("Printing puzzle before search:\n");
  printPuzzle(block, bSize);
  printf("\n");

  // Call searchPuzzle to find all words in the puzzle
  searchPuzzle(block, bSize, words, 50);
  printf("\n");

  // Print out final puzzle grid with found words in lower case
  printf("Printing puzzle after search:\n");
  printPuzzle(block, bSize);
  printf("\n");

  return 0;
}











void printPuzzle(char** arr, int n){
  // This function will print out the complete puzzle grid (arr). It must produce the output in the SAME format as the samples in the instructions.
  // Your implementation here 

  for (int i = 0; i < n; i++){
     for (int j = 0; j < n; j++){
           printf("%c ", *(*(arr + i) + j));
     }

     printf("\n");
  }



}














void searchPuzzle(char** arr, int n, char** list, int listSize){
  // This function checks if arr contains words from list. If a word appears in arr, it will print out that word and then convert that word entry in arr into lower case.
  // Your implementation here



for(int e = 0; e < listSize; e++){ 
     for(int f = 0; f < strlen(*(list+e)); f++){
        if(*(*(list + e) + f) >= 'a' &&  *(*(list + e) + f) <= 'z' ){
           *(*(list + e) + f) = *(*(list + e) + f) - ('a' - 'A');
           }
     }
  }











  int k = 0;
  for(int a = 0; a < listSize; a++){
     for(int b = 0; b < n; b++){
        for(int c = 0; c < n; c++){

              if(*(*(list + a) + k) >= 'a' &&  *(*(list + a) + k) <= 'z' ){
                 *(*(list + a) + k) = *(*(list + a) + k) - ('a' - 'A');
              }

           if( *(*(list + a) + k) == *(*(arr + c) + b) ){
              k++;
           }
           if( *(*(list + a) + k) != *(*(arr + c) + b) ){
              k = 0;
              break;
              }
           printf("%i ", k);
           if ( k == (strlen(*(list+a))-1) ){
                 printf("Found: ");
                 for(int l = 0; l < strlen(*(list+a)); l++){
                    printf("%c", *(*(list + a) + l));
                    //printf("\n");
                 }
                 printf("\n");
                 k = 0;
                 break;
           }
        }
     }


  }



}
4

2 回答 2

0
           if( *(*(list + a) + k) == *(*(arr + c) + b) ){
              k++;
           }
           if( *(*(list + a) + k) != *(*(arr + c) + b) ){
              k = 0;
              break;
           }
  1. 在第一个中,如果找到匹配项if,则增加。k然后,在 nextif中,我们检查单词中的下一个字符(因为我们做了k++),与填字游戏中的相同字符*(*(arr + c) + b)。例如,在 中NEWYORK,您匹配NN到目前为止很好),然后EN不相等的比较,因此它会跳出循环。您应该在if .. else此处使用 an,而不是两个单独if的 s,因为只有在第一个为 false 时才应检查第二个条件。

  2. 当您找到一个不匹配的字符时,您正在使用break. 这将跳出c循环,这意味着,如果填字游戏行中的任何字符无法匹配列表中的单词,则不会检查该行中的剩余字符。在这里,您不必跳出循环;设置k = 0应该足够了。

  3. *(*(arr + c) + b)c在内循环中递增,因此您只检查填字游戏中的垂直匹配。如果您还想检查水平匹配,您也应该在更改bandc循环的嵌套顺序后进行相同的检查。(或者您可以*(*(arr + b) + c)在同一个循环中检查(更改 b 和 c 位置)并使用另一个变量来代替水平k。但请注意,如果填字游戏不是正方形,即不是 NxN,这将不起作用)
  4. 正如@bruno 在评论中提到的那样,使用arr[c][b]而不是*(*(arr + c) + b)因为它更具可读性和可维护性。还可以使用循环来读取填字游戏中的字符。这将比%c %c %c ...

  5. 在我的 linux 机器中,以下代码从列表中的单词中截断一个额外的字符。很可能是因为您在 Windows 上,而 Windows 使用\r\n行尾,而 Linux 使用\n结尾。因此,如果您的单词列表文件是在非 Windows 机器(Mac、Linux)中编写的,这将不会像您预期的那样工作。如果您希望它在任何地方工作,您可以使用 strcspn函数 with\r\n删除换行符。

  // Remove newline characters from each word (except for the last word)
  for(i=0; i<49; i++){
     *(*(words+i) + strlen(*(words+i))-2) = '\0';   
  }

进行更改后,您应该得到这个(告诉是否缺少任何东西):

Found:ALABAMA
Found:ALASKA
Found:ARIZONA
Found:CALIFORNIA
Found:FLORIDA
Found:GEORGIA
Found:HAWAII
Found:ILLINOIS
Found:INDIANA
Found:NEVADA

既然是学校作业,我会让你在代码中进行更改。

于 2020-04-26T14:07:28.257 回答
0

我稍微修改了打印功能。我想它应该工作:

#include <stdio.h>
#include <string.h>
#define ARRAY_SIZE(X) sizeof(X) / sizeof(X[0])

void printPuzzle(const char ** arrP, int size){
  for (int i = 0; i < size; i++){
     printf(*arrP++);
     printf("\n");
  }
}


// Main function, DO NOT MODIFY!!!   
int main(int argc, char **argv) {
 const char * puzzle [] = {"ABC","DEF","GHI"};
printPuzzle(puzzle, ARRAY_SIZE(puzzle));
  return 0;
}
于 2020-04-26T08:38:40.603 回答