Fgets 只返回 '\n' 字符
Fgets only returning '\n' char
我正在尝试使用 fgets 从 stdin 获取一行。这是我的代码
char* FENString;
printf("Enter FEN Key: ");
fgets(FENString, 50, stdin);
FENString 只有一个字符,就是换行符。我试过寻求帮助但没有找到任何东西,有谁知道为什么会这样?
确保所有变量都分配了某种内存非常重要,至少在其生命周期的某个时刻。这里的问题是 char 指针没有分配任何类型的内存。可以修复它的是 malloc
ing 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;
}
我正在尝试使用 fgets 从 stdin 获取一行。这是我的代码
char* FENString;
printf("Enter FEN Key: ");
fgets(FENString, 50, stdin);
FENString 只有一个字符,就是换行符。我试过寻求帮助但没有找到任何东西,有谁知道为什么会这样?
确保所有变量都分配了某种内存非常重要,至少在其生命周期的某个时刻。这里的问题是 char 指针没有分配任何类型的内存。可以修复它的是 malloc
ing 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;
}