首页 > 解决方案 > 循环通过 2D Char Array、Wordsearch 时出现分段错误

问题描述

我的任务是创建一个 wordsearch 来查看列表中的单词(在代码中称为“list”)并在 2D 网格中找到它(称为“arr”)。如果找到一个单词,我需要将网格中的单词小写并打印出来。我需要查看 5 个方向,r2l、l2r、t2b、tl2br 和 tr2bl。我能够运行从右到左的比较,并且能够用找到的小写单词打印出网格。但是,每次尝试在任何其他方向进行比较时,都会出现段错误。有什么帮助吗?

Puzzle.txt 文件:https ://ucmerced.box.com/s/twkdxega6d34bkou3mpy0xtm901grlx3 states.txt 文件: https : //ucmerced.box.com/s/4zi7etq3wab3y81m64kx6naaiy2bttea

#include <string.h>


void printPuzzle(char** arr, int n);
void searchPuzzle(char** arr, int n, char** list, int listSize);

void lowerCaseL2R(char** arr, int y, int x, int lengthOfWord);
void lowerCaseT2B(char** arr, int y, int x, int lengthOfWord);
int searchAll(char** arr, int k, int l, int ii, char** list, int lengthOfWord);
char upperCase(char letter);

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){
    int i, j;
    for(i = 0; i < n; i++){
        for(j = 0; j < n; j++){
            printf("%c", *(*(arr + i) + j));
            if(j == (n - 1)){
                printf("\n");
            }
        }
    }
}
void searchPuzzle(char** arr, int n, char** list, int listSize){
    //arr is puzzle block (wordsearch), n is 15, list is a 2D array of words we are searching for (states), listSize is 50;

    int i, j, k, l, m, lengthOfWord = 0, found = 0;
    for(i = 0; i < listSize; i++){
        for(j = 0; (*(*(list + i) + j) != '\0'); j++){
            //number of iterations is equivalent to length of word;
        }
        lengthOfWord = j;
        for(k = 0; k < 15; k++){
            for(l = 0; l < 15; l++){
                if(*(*(arr + k) + l) == *(*(list + i))) {
                    found = searchAll(arr, k, l, i, list, lengthOfWord);
                    if(found == 1){
                        lowerCaseL2R(arr, k, l, lengthOfWord);  
                    }
                    if(found == 2){
                        lowerCaseT2B(arr, k, l, lengthOfWord);  
                    }
                }
            }
        }
    }
}
int searchAll(char** arr, int k, int l, int ii, char** list, int lengthOfWord){
    int dir1, i1, i2, count1 = 0, count2 = 0;
        for(dir1 = 0; dir1 < lengthOfWord; dir1++){
            if((*(arr + k) + (l + dir1))){
                if(*(*(arr + k) + (l + dir1)) == (upperCase(*(*(list + ii) + dir1)))){
                    count1++;
                }
                if(count1 == lengthOfWord){
                    printf("Found: ");
                    for(i1 = 0; i1 < lengthOfWord; i1++){
                        printf("%c", *(*(list + ii) + i1));
                    }
                    printf("\n");
                    return 1;
                }
            }
        }
        /*(for(dir2 = 0; dir2 < lengthOfWord; dir2++){
            if((*(arr + k + dir2) + l)){ // if(*(*(arr + k + dir2) + l)) != '\0' did NOT work
                if(*(*(arr + k + dir2) + l) == (upperCase(*(*(list + ii) + dir2)))){
                    count2++;
                }
                if(count2 == lengthOfWord){
                    printf("Found: ");
                    for(i2 = 0; i2 < lengthOfWord; i2++){
                        printf("%c", *(*(list + ii) + i2));
                    }
                    printf("\n");
                    return 2;
                }
            }
        }*/

return 0;
}

char upperCase(char letter){
    if(letter >= 'a' && letter <= 'z'){
        letter = letter + ('A' - 'a');
    }
return letter;
}


void lowerCaseL2R(char** arr, int y, int x, int lengthOfWord){  
    for(int i = 0; i < lengthOfWord; i++){
        *(*(arr + y) + (x + i)) = *(*(arr + y) + (x + i)) + ('a' - 'A');
    }
}

标签: carrayssegmentation-faultchar2d

解决方案


推荐阅读