Почему я никогда не прошёл 1? - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь создать программу для поиска слова из двумерного массива, используя только указатели. В моей основной функции для фактического поиска слов у меня есть цикл while, который должен продолжаться до тех пор, пока я не превышаю длину слова и до тех пор, пока буквы из слова соответствуют буквам насетки. После нахождения слова он должен сделать буквы на сетке строчными и распечатать, что нашел слово. Вот вся моя программа прямо сейчас.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

void printPuzzle(char** arr, int n);
void searchPuzzle(char** arr, int n, char** list, int listSize);
void searchWord(int j, int k, int gridsize, char** arr, char** list, int listPos);

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*));

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

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

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

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

    for(i=0; i<49; i++){
        *(*(words+i) + strlen(*(words+i))-2) = '\0';    
    }

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

    printf("Printing puzzle before search:\n");
    printPuzzle(block, bSize);
    printf("\n");

    searchPuzzle(block, bSize, words, 50);
    printf("\n");

    printf("Printing puzzle after search:\n");
    printPuzzle(block, bSize);
    printf("\n");

    return 0;
}

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

}

void searchPuzzle(char** arr, int n, char** list, int listSize){
    for(int i = 0; i < listSize; i++){
        for(int j = 0; j < 15; j++){
            for(int k = 0; k < 15; k++){
                    searchWord(j, k, 15, arr, list, i);
                }
            }

        }

}


void searchWord(int j, int k, int gridsize, char** arr, char** list, int listPos){
    int wordlength = strlen(*(list+listPos));
    if(j+wordlength <= gridsize){ //Horizontal
        int i = 0;
        while(i < wordlength && *(*(arr+(j+i))+k) == *(*(list+listPos)+i)){
            i++;
        }
        if(i == wordlength){
            while(i > 0 && *(*(arr+(j+i))+k) == *(*(list+listPos)+i)){
            *(*(arr+(j+i))+k) = tolower(*(*(arr+(j+i))+k));
            i--;
            }
            printf("Word found: ");
            for(i = 0; i < wordlength; i++)
                printf("%c", *(*(list+listPos)+i));
        }
    }

    if(k+wordlength <= gridsize){ //Vertical
        int i = 0;
        while(i < wordlength && *(*(arr+j)+(k+i)) == *(*(list+listPos)+i)){
            i++;
        }
        if(i == wordlength){
            while(i > 0 && *(*(arr+j)+(k+i)) == *(*(list+listPos)+i)){
            *(*(arr+(j+i))+k) = tolower(*(*(arr+(j+i))+k));
            i--;
            }
            printf("Word found: ");
            for(i = 0; i < wordlength; i++){
                printf("%c", *(*(list+listPos)+i));
            }
        }
    }

    if(j+wordlength <= gridsize && k+wordlength <= gridsize){ //Diagonal
        int i = 0;
        while(i < wordlength && *(*(arr+(j+i))+k) == *(*(list+listPos)+i)){
            i++;
        }
        if(i == wordlength){
            while(i > 0 && *(*(arr+(j+i))+(k+i)) == *(*(list+listPos)+i)){
            *(*(arr+(j+i))+(k+i)) = tolower(*(*(arr+(j+i))+(k+i)));
            i--;
            }
            printf("Word found: ");
            for(i = 0; i < wordlength; i++)
                printf("%c", *(*(list+listPos)+i));
        }
    }



}

Это та часть, с которой, как мне кажется, есть проблема.

while(i < wordlength && *(*(arr+(j+i))+k) == *(*(list+listPos)+i)){
            i++;
        }

Если после этого я распечатаю десятичное значение iцикл должен в какой-то момент приблизиться к длине одного из слов, так как я знаю, что некоторые слова горизонтальны, однако каждый раз, когда он перебирает и печатает значение i, оно никогда не превышает 1, что означает, что цикл while никогда не выполняется более одного раза, чтоневозможно с файлами wordsearch, которые я использую, чтобы проверить это. Что является причиной этого? Это также 0 или 1 для любого другого направления, когда я пытаюсь, пример выше был просто циклом while из горизонтального поиска.

Также может быть проблема с функцией searchPuzzle и величиной, по которой она проходит. Тем не менее, я думаю, что это может быть только мое воображение.

Дополнительная информация: Сетка 15х15, в списке 50 слов.

1 Ответ

0 голосов
/ 07 ноября 2019

Я думаю, что вам может потребоваться снова объявить Wordsearch после && -

while(i < wordlength && wordlength *(*(arr+(j+i))+k) == *(*(list+listPos)+i)){
            i++;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...