Ошибка сегментации при попытке печати строк из двумерного массива через массив указателей - PullRequest
0 голосов
/ 01 декабря 2019

Редактировать:

Таким образом, для тех, у кого возникла та же проблема, кажется, что, несмотря на инициализацию массива указателей в NULL, в массиве все еще был написан мусор. Я исправил сегментацию, заменив заголовок последнего оператора while (в функции-принтере) следующим образом:

while( (wordPtr[ctr] != NULL) && (ctr < MAX_WORDS) )

Оригинальный вопрос:

Первая функция программы должна получитьtext и заполните двумерный массив строк словами в тексте, но каждое слово должно появляться только один раз. Затем он должен заполнить двумерный массив указателей на строки адресами слов таким образом, чтобы вторая функция могла затем использовать эти указатели для повторной печати текста в том порядке, в котором она была изначально.

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

Я думаю, чтопроблема лежит где-то в строках, где я указываю указатель на слово, но кроме этого я не могу найти много.

Я пытался использовать gdb, но результат указывал на strlen.s, который является функциейчто я нигде не использовал в коде.

Заранее спасибо.

Код:


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


#define MAX_WORDS 6
#define MAX_WORD_LEN 10

void placer(char wordsArray[MAX_WORDS][MAX_WORD_LEN], char *ptr[MAX_WORDS][2]);
void printer(char *wordPtr[][2], int linelen);

int main (int argc, char *argv[]){
     char wordArray[MAX_WORDS][MAX_WORD_LEN] = {{ '\0' }};
     char *wordPtr[MAX_WORDS][2] = {{ NULL }};
     int linelen = 100;

     placer(wordArray, wordPtr); 
     printer(wordPtr, linelen);

     return 0;
}

void placer(char wordsArray[][MAX_WORD_LEN], char *ptr[][2]){

    int i, j, k, temp, w = 0, g = 0;
    char check[MAX_WORD_LEN] = {'\0'};
    for (i = 0; i < MAX_WORDS; i++) {

        scanf("%s", wordsArray[i]);

        //Converts to lowercase
        for (j = 0; j < MAX_WORD_LEN; j++) {
            if(isupper(wordsArray[i][j])) {
                wordsArray[i][j] = tolower(wordsArray[i][j]);
            }
        }

        //assigns to pointer array
        ptr[w][0] = &wordsArray[i][0];

        //Checks if word already exists in array
        for(k = 0; k < i; k++) {
            if(strcmp(wordsArray[i], wordsArray[k]) == 0) {
                //Directs pointer to the already existing instance of the word
                ptr[w][0] = &wordsArray[k][0];
                //replaces the word with \0
                for (g = 0; g < MAX_WORD_LEN; g++) {
                    wordsArray[i][g] = '\0';
                }
                i--;
                break;
            }
        }
        w++;
    }

    //prints from array of unique words
    printf("%s\n\n\n", &wordsArray[1][0]);
    for(temp = 0; temp < MAX_WORDS; temp++) {
        printf("%s\n", wordsArray[temp]);
    }

    printf("\n##\n");
}

void printer(char *wordPtr[][2], int linelen) {

    int ctr = 0, t;

    //prints using pointers
    while (wordPtr[ctr] != NULL) {
        printf("%s", *wordPtr[ctr]);
        ctr++;
    }
}

...