使用gets()读取char *会导致“ Core Dumped”错误(C语言)

时间:2019-03-21 17:36:26

标签: c memory segmentation-fault core

我正在尝试使用非固定的char数组读取用户输入,但是当我在键盘上输入内容时,它只是软崩溃(没有崩溃窗口)。当我在联机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 个答案:

答案 0 :(得分:3)

这里

char* userInput;

userInput没有有效的内存,因此您可以像

一样将一些数据放入其中
gets(userInput); /* this causes seg.fault because till now userInput doesn't have any valid memory */

因此,要克服此问题,请使用字符数组,例如

char userInput[100] = {0};

或创建动态数组,然后将数据扫描到动态分配的内存中。

也不要使用gets(),而应使用here中的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);