gpt4 book ai didi

c - 问题 : Filename extension for tmpnam(), rand() 生成算法提前,& fgetc() 的流表达式

转载 作者:行者123 更新时间:2023-11-30 19:22:23 25 4
gpt4 key购买 nike

我已经阅读完有关 stdio.h 函数的内容,需要一些小的说明。

请花一点时间对以下内容进行简短解释:

1) tmpnam() : 它只给我们一个包含唯一文件名的字符串,但是如何处理该文件扩展名?我们每次都必须使用 strcat() 将文件扩展名添加到文件名中吗?

2) rand() : 以下内容在 rand() 上下文中意味着什么 (取自cplusplusreference)?:

"In C, the generation algorithm used by rand is guaranteed to only be advanced by calls to this function"

我检查了它,为同一个种子重复调用 rand() ,但它没有给出递增的值!

3) getc() :下面的描述中粗体部分是什么意思getc() 的参数取自同一站点( getc() )?

"---Parameter

Pointer to a FILE object that identifies an input stream.

Because some libraries may implement this function as a macro, and this may evaluate the stream expression more than once, this should be an expression without side effects."

最佳答案

  1. 除非您自己提供缓冲区并知道它有多大,否则您无法修改返回的文件名。任何字符串复制或修改功能都可以。
  2. 这意味着 rand() 返回的数字序列仅受对 rand() 函数本身的调用影响:无论您在调用之间执行什么操作到rand(),您将得到相同的输出。也就是说,底层函数只能通过调用 rand() 来推进。这并不意味着产量总是在增加。
  3. 这意味着 getc() 可能是一个对其参数求值两次的宏。为什么不尝试找出这段代码可能产生的结果:

    int i = 0;
    (void)getc((++i,stdin));
    printf("%d\n", i);

    下面是专门使用 getc() 宏的实现示例:AIX docs 。如果我没记错的话,如果您没有将正确的指针传递给 filenodirfd(可能还有其他指针),那么在 AIX 上您也会遇到麻烦。看起来 OpenSolaris 也使用这个定义来做到这一点,尽管我手头没有副本(glibc、FreeBSD,不要使用宏)。

    #define getc(p)     (--(p)->_cnt>=0? ((int)*(p)->_ptr++):_filbuf(p))

关于c - <cstdio> 问题 : Filename extension for tmpnam(), rand() 生成算法提前,& fgetc() 的流表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16678597/

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