Чтение char * с помощью gets () приводит к ошибке «Core Dumped» (язык C) - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь прочитать пользовательский ввод с нефиксированным массивом символов, но он просто мягко вылетает (без окна сбоя), когда я что-то вводю с клавиатуры. Когда я запускаю его на онлайн-компиляторе C, он говорит: Ошибка сегментации (сброшено ядро) .

Мой код:

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

int validerNAS(char* userInput);

int main() {
    int valid = 0;
    char* userInput;

    do {
        printf("Enter 9 characters: ");
        gets(userInput);
        valid = validerNAS(userInput);
    } while (!valid);
    return 0;
}

int validerNAS(char* userInput) {
    if ((strlen(userInput) != 9))  {
        printf("Error! You must enter 9 characters\n\n");
        return 0;
    }
    return 0;
}

1 Ответ

3 голосов
/ 21 марта 2019

Здесь

char* userInput;

userInput не имеет допустимой памяти, поэтому вы можете поместить в нее некоторые данные, например

gets(userInput); /* this causes seg.fault because till now userInput doesn't have any valid memory */

. Чтобы преодолеть эту проблему, используйте символмассив типа

char userInput[100] = {0};

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

Также не используйте gets(), используйте fgets() вместо этого, как указано в здесь

Например,

char* userInput = malloc(SOME_SIZE); /* define SOME_SIZE, creating dynamic array equal to SOME_SIZE  */
fgets(userInput ,SOME_SIZE, stdin) ; /* scan the data from user & store into dynamically created buffer */

Примечание:со страницы руководства с fgets

Если читается символ новой строки , он сохраняется в буфере .Завершающий нулевой байт (aq \ 0aq) сохраняется после последнего символа в буфере.

Поэтому удалите завершающий символ новой строки, вызвав strcspn().Например,

userInput[strcspn(userInput, "\n")] = 0; 

И как только использование динамического массива userInput завершено, не забудьте освободить динамически распределенную память, вызвав free(), чтобы избежать утечки памяти .Например,

free(userInput);
...