Fgets 只返回 '\n' 字符

Fgets only returning '\n' char

我正在尝试使用 fgets 从 stdin 获取一行。这是我的代码

char* FENString;
printf("Enter FEN Key: ");
fgets(FENString, 50, stdin);

FENString 只有一个字符,就是换行符。我试过寻求帮助但没有找到任何东西,有谁知道为什么会这样?


确保所有变量都分配了某种内存非常重要,至少在其生命周期的某个时刻。这里的问题是 char 指针没有分配任何类型的内存。可以修复它的是 mallocing FENString,或者可能将声明更改为 char FENString[50];

通过提供指向 fgets 的未初始化指针,您有未定义的行为。分配>=50大小的内存给FENString,然后传给fgets.

解决方案一

char* FENString;
FENString = malloc(50);
if( FENString == NULL){
    fprintf(stderr,"%s\n","Error in malloc");
    exit(1);
}
printf("Enter FEN Key: ");
if( fgets(FENString, 50, stdin) == NULL){
    fprintf(stderr,"%s\n","Error in input");
    exit(1);
}
// Work with FENString;
...
free(FENString);

解法-2

简单地有一个像这样的char数组char FENString[50];那么代码将是

char FENString[50];
printf("Enter FEN Key: ");
if( fgets(FENString, sizeof FENString, stdin) == NULL){
    fprintf(stderr,"%s\n","Error in input");
    exit(1);
}
// Work with FENString

而不是 50 这里 sizeof FENString 虽然它做同样的事情,但对于一个良好的可维护解决方案来说要好得多。如果你改变它,你不必搜索和替换 50 由于使用 sizeof 它会自动完成。(彼得指出)

这里

char* FENString;
printf("Enter FEN Key: ");
fgets(FENString, 50, stdin);

FENString 是一个 字符指针 并且在将任何数据放入其中之前,FENString 应该具有 有效内存 space 把东西存进去。但在你的情况下 FENString 没有指向有效地址,这是问题所在。

要解决此问题,您可以将 FENString 作为字符缓冲区,例如

char FENString[1024] = {}; 

或为 FENString 动态分配内存,如

char* FENString = malloc(sizeof(*FENString) * MAX_BUF_SIZE); /* define the MAX_BUF_SIZE, instead of magic number like 50 use macro */
/* Do error handling malloc() */
if(FENString == NULL){
    fprintf(stderr, "malloc() failed\n");
    exit(1);
}

现在通过调用 fgets() 将用户输入存储到动态创建的数组中。例如

if(fgets(FENString, MAX_BUF_SIZE, stdin) != NULL){
    /* fgets is success, but if fgets store the \n at the end of buffer if its read */
    /* to remove trailing \n char use strcspn() */
    FENString[strcspn(FENString, "\n")] = 0;
}