Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        2年前关闭。
                                                                                            
                
        
我正在尝试使用fgets从stdin中获得一行。这是我的代码

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


FENString只有一个字符,这是换行符。我已经尝试寻求帮助,却一无所获,有人知道为什么会这样吗?



确保所有变量至少在其生命周期的某个阶段都分配有某种内存是非常重要的。这里的问题是char指针没有分配任何类型的内存。可以解决此问题的方法是malloc设置FENString,或者将声明更改为类似char FENString[50];的内容

最佳答案

通过提供指向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,它会自动完成。(Peter指出)

10-06 01:40