首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C fgets问题

C fgets问题
EN

Stack Overflow用户
提问于 2010-10-14 02:29:54
回答 3查看 1.4K关注 0票数 3
代码语言:javascript
复制
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返回的指针被存储在其中,但仅此而已,它没有任何用途。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-14 02:32:05

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

代码语言:javascript
复制
if (!result)
{
  free(infoPtr); // To not leak the object allocated at the start
  return NULL; // Function failed
}

如果第一个fget成功,第二个失败,你可能仍然会有泄漏,因为有额外的分配给结构的指针成员。不幸的是,因为结构没有初始化为零,所以您不能检查这些指针是否为空。因此,也许使用calloc而不是malloc,或者至少将所有结构指针成员初始化为NULL,可能会是一个更好的想法。

票数 2
EN

Stack Overflow用户

发布于 2010-10-14 02:32:58

似乎有人开始实现错误检查,但最终搞砸了。返回值应该与NULL进行比较,如果相等则报告错误。

票数 2
EN

Stack Overflow用户

发布于 2010-10-14 02:35:53

最有可能的是,编译器抛出了一个关于被忽略的函数返回值的警告。程序员并不关心fgets的返回值,而只是简单地添加到result =中,以使编译器不再纠结于此。正确的解决方案应该是检查返回值,以确保函数成功完成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3926805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档