<cstdio>问题:tmpnam()的文件名扩展名,rand()生成算法进展,&amp; fgetc()的流表达式</cstdio>

时间:2013-05-21 20:08:34

标签: c stdio

我已经阅读了stdio.h个函数,需要做一些小的澄清。

请花一点时间简要解释以下内容:

1) tmpnam() 它只为我们提供了一个包含唯一文件名的字符串,但是如何处理文件扩展名呢?我们会不会每次使用strcat()将文件扩展名添加到文件名?

2) rand() 以下rand()(取自cplusplusreference)的上下文中含义如何?:

  

“在C中,rand使用的生成算法保证只有   通过调用此函数来提升“

我检查过它,一个接一个地为同一个种子重复调用rand(),但它没有给出增加值!

3) getc() 粗体中的部分在以下{{1的参数说明>中的含义是什么意思取自同一网站(getc())?

  

“---参数

     

指向标识输入的FILE对象的指针   流。

     

因为某些库可能会将此函数实现为宏,并且这可能会多次评估流表达式,这应该是   没有副作用的表达。“

1 个答案:

答案 0 :(得分:1)

  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))