为什么gets(stdin)返回整数?等错误

Lim*_*mon 3 c compiler-errors gets standard-library

我是C编程新手(尽管我有Java经验)。阅读了一些教程之后,我决定开始解决Coderbyte上的编码难题。

我尝试的第一个挑战是这一个

挑战

让函数FirstFactorial(num)接受传递的num参数并返回其阶乘。例如:如果num = 4,则您的程序应返回(4 * 3 * 2 * 1) =24。对于测试用例,范围将在1到18之间,并且输入将始终是整数。

样本测试用例

输入:4
输出:24

输入:8
输出:40320

我的解决方案:

#include <stdio.h>

void FirstFactorial(int num[]) {

  int i = num -1;

  for(i ; i > 0; i--) {
    num = num * i;
    printf("%d",i);
  }

  printf("\t %d", num);
}

int main(void) {

  // disable stdout buffering
  setvbuf(stdout, NULL, _IONBF, 0);

  // keep this function call here
  FirstFactorial(gets(stdin));
  return 0;

}
Run Code Online (Sandbox Code Playgroud)

输入参数的值:8

错误信息:

#include <stdio.h>

void FirstFactorial(int num[]) {

  int i = num -1;

  for(i ; i > 0; i--) {
    num = num * i;
    printf("%d",i);
  }

  printf("\t %d", num);
}

int main(void) {

  // disable stdout buffering
  setvbuf(stdout, NULL, _IONBF, 0);

  // keep this function call here
  FirstFactorial(gets(stdin));
  return 0;

}
Run Code Online (Sandbox Code Playgroud)

所以似乎有一些问题,我有几个问题:

  1. 我从未听说过gets(stdin)。我抬起头gets(),glibc文档说该函数返回一个char*。如何将其传递给需要一个的函数int
  2. 看起来像

    int i = num -1;
    
    Run Code Online (Sandbox Code Playgroud)

    初始化i为4而不是7。为什么?

  3. for循环似乎正在i正确递减(i= 7、6、5、4、3、2、1 )。但是这句话:

    num = num * i;
    
    Run Code Online (Sandbox Code Playgroud)

    正在生成错误。怎么了 它看起来像一个普通的乘法。

Dra*_*nis 5

为了将来的访客:

这是对Coderbytes用于“便利”的语言的严重滥用。gets(stdin)首先不应该起作用:类型不起作用。

实际上发生的是Coderbytesgets(stdin)在将代码发送到编译器之前,盲目查找并替换了您提供的文字字符串的第一个实例。这甚至不是预处理器宏,而是源代码上的盲目替换。

因此,尽管您实际上不应该这样做,但是在Coderbytes上却是一个必不可少的弊端:这似乎是将输入放入程序的唯一受支持的方法。

资源


另外,如果您想娱乐一下,请尝试清除所有其他内容并将其放入Coderbytes:

int main(){
    printf("%s", "This is a literal string containing gets(stdin) along with other words");
}
Run Code Online (Sandbox Code Playgroud)

您会看到,即使在字符串文字中也进行替换!