Почему я получаю ошибку сегментации 11 (чтение входных данных с использованием fgets и сохранение в массиве)? - PullRequest
0 голосов
/ 15 ноября 2018

Извините, если это очень нубский вопрос, я новичок в C и испытываю значительные затруднения с пониманием указателей и других понятий, делающих его очень трудным.Ошибка сегментации, я не знаю, почему, пожалуйста, помогите.Я думаю, что это может быть из-за использования массивов для хранения.Кроме того, если бы вы могли порекомендовать отладчик, было бы очень полезно.Заранее спасибо.

 #include <stdio.h>

 #include <string.h>


char *lineaccept(char *buf, size_t sz){ //Getting inputs using fgets() and storing it in buf.
        if(fgets(buf,sz,stdin)==NULL){
            printf("ERROR\n");
            return NULL;
        }
        if(strlen(buf) == 1) {
                printf("ERROR\n");
                return NULL;
        }
        return buf;
        }


void delimitLine(char *buf, char *delimited[], size_t max){ //Taking the string from buf and getting each individual word to store in split[]

if(buf != NULL){
    const char s[2] = " ";
    char *token;
    token = strtok(buf, s);
    int counter = 0;
    while( token != NULL && counter <= max){
        split[counter] = token;
        token = strtok(NULL, s); 
        counter ++;
    }
    for(int y = 0; y < counter; y++){
        if(split[y]==NULL){
            break;
        }else{
            printf("%s\n",split[y]);
        }
    }
}

}

int main(void) {
    const int maxWords = 10;
    char maxLenInput[11];
    char *arrOfWords[100];
    char inputFromLine[100];
    while(strcmp((strcpy(inputFromLine,lineaccept(maxLenInput, maxWords))), "")>0) {
        delimitline(inputFromLine, arrOfWords, maxWords);
    }


     return 0;
}

1 Ответ

0 голосов
/ 15 ноября 2018

Следующая часть вашего кода вернет NULL, если вы нажмете только Enter на консоли (без ввода какого-либо другого символа перед «Enter»). Это связано с тем, что fgets будет хранить новую строку как единственный символ в buf, поэтому strlen(buf) будет 1, затем:

char *read_line(char *buf, size_t sz){
   .... 
   if (fgets(buf,sz,stdin)) {
      if(strlen(buf) == 1) {
         return NULL;
         ...

Когда вы затем передаете результат вызова на read_line на strcpy, как вы делаете с

strcpy(inputFromLine,read_line(maxLenInput, maxWords)

тогда вы фактически передаете NULL в strcpy и тем самым получаете доступ к «недействительной» памяти; неопределенное поведение, скорее всего, ошибка.

...