gpt4 book ai didi

C fgets问题

转载 作者:行者123 更新时间:2023-12-04 11:08:22 25 4
gpt4 key购买 nike

struct DVDInfo  *ReadStruct( void ) {
struct DVDInfo *infoPtr;
int num;
char line[ kMaxLineLength ];
char *result;

infoPtr = malloc( sizeof( struct DVDInfo ) );

if ( NULL == infoPtr ) {
printf( "Out of memory!!! Goodbye!\n" );
exit( 0 );
}

printf( "Enter DVD Title: " );
result = fgets( line, kMaxLineLength, stdin );
line[ strlen( line ) - 1 ] = '\0';
infoPtr->title = MallocAndCopy( line );

printf( "Enter DVD comment: " );
result = fgets( line, kMaxLineLength, stdin );
line[ strlen( line ) - 1 ] = '\0';
infoPtr->comment = MallocAndCopy( line );

do {
printf( "Enter DVD Rating (1-10): " );
scanf( "%d", &num );
Flush();
}
while ( ( num < 1 ) || ( num > 10 ) );

infoPtr->rating = num;

printf( "\n----------\n" );

return( infoPtr );
}

上面的变量“result”的目的是什么?什么也没做。从 fgets 返回的指针存储在其中,但就是这样,它没有任何用处。

最佳答案

您应该测试该结果是否为 NULL,以检查 EOF 条件或错误,而不是仅仅忽略它。此外,通过不检查结果,您正在在线执行 strlen,这可能具有未初始化的数据,因为 fgets 失败。真的,你应该在 fgets 之后:

if (!result)
{
free(infoPtr); // To not leak the object allocated at the start
return NULL; // Function failed
}

如果第一个 fgets 成功而第二个失败,你可能仍然有泄漏,因为对结构的指针成员有额外的分配。不幸的是,由于该结构未初始化为零,因此您无法检查这些指针是否为 NULL。因此,或许使用 calloc 而不是 malloc 或至少将所有结构指针成员初始化为 NULL 会是一个更好的主意。

关于C fgets问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3926805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com