【问题标题】:Fgets only returning '\n' char [closed]Fgets 只返回 '\n' 字符 [关闭]
【发布时间】:2018-05-23 09:49:42
【问题描述】:

我正在尝试使用 fgets 从标准输入中获取一行。这是我的代码

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

FENString 只有一个字符,即换行符。我已经尝试寻求帮助,但没有找到任何东西,有谁知道为什么会发生这种情况?


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

【问题讨论】:

标签: c string char fgets


【解决方案1】:

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

解决方案-1

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,它将自动完成。(彼得指出)

【讨论】:

  • @user3386109.:感谢您的编辑。感谢您的时间和帮助。
  • 在“solution-2”中,可以在fgets() 调用中使用sizeof(FENString) 而不是50。这样可以确保传递正确的值,而不管FENString 定义的维度是什么(因此,如果数组的维度发生变化,则无需记住将指定的长度更改为fgets())。
  • @Peter.:是的,这是一个不错的选择。我编辑了。感谢您的建议。
  • @Peter.:添加了解释。再次感谢
【解决方案2】:

这里

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

FENString 是一个字符指针,在将任何数据放入其中之前,FENString 应该有有效的内存空间来存储一些东西。但在您的情况下,FENString 没有指向有效地址,这是问题所在。

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

char FENString[1024] = {}; 

或者为FENStringlike动态分配内存

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-27
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    相关资源
    最近更新 更多