Хранение введенных пользователем строк в массив строк в c? - PullRequest
0 голосов
/ 09 марта 2019

Довольно плохо знаком с C, я пытаюсь прочитать файл из нескольких слов, используя косвенное обращение bash, и поместить слова в массив строк. Конец файла помечен -1.

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

void init(char* words[]);

int main(int argc,char *argv[]){
    char* words[400000];
    init(words);
    int i = 0;
    do{
        printf("%s",words[i]);
        i++;
    }while(!strcmp(words[i],"-1"));
}
void init(char* words[]){ // initializes array
    int i = 0;
    do{
        fgets(words[i],1024,stdin);
        i++;
    }while(!strcmp(words[i],"-1"));
}

Это дает мне ошибку сегментации, если нужна какая-либо другая информация, я более чем рад ее предоставить.

1 Ответ

0 голосов
/ 09 марта 2019

Если я правильно угадал, «400000» означает максимальное количество строк, которые может ввести пользователь. Но размер стека по умолчанию в ОС Windows составляет 1 М, sizeof (void *) * 400000 = 1 600 000 ...

Другое дело, что вы не выделили память для каждой строки.

Итак, я пытаюсь исправить ваш код следующим образом:

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

#define MAX_LINE 4000  // '400000' is really too big!

void init(char* words[]);

int main(int argc,char *argv[]){
    char* words[MAX_LINE];
    memset(words, 0 , sizeof(words));
    init(words);
    int i = 0;
    do{
        printf("%s",words[i]);
        delete words[i];
        words[i] = nullptr;
        i++;
    }while(!strcmp(words[i],"-1"));
}
void init(char* words[]){ // initializes array
    int maxLen = 1024;
    int i = 0;
    do{
        words[i] = new char[maxLen];
        memset(words[i], 0, maxLen);
        fgets(words[i], maxLen, stdin);
        i++;
    }while(!strcmp(words[i],"-1") && i < MAX_LINE);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...