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)
所以似乎有一些问题,我有几个问题:
gets(stdin)。我抬起头gets(),glibc文档说该函数返回一个char*。如何将其传递给需要一个的函数int?看起来像
int i = num -1;
Run Code Online (Sandbox Code Playgroud)
初始化i为4而不是7。为什么?
for循环似乎正在i正确递减(i= 7、6、5、4、3、2、1 )。但是这句话:
num = num * i;
Run Code Online (Sandbox Code Playgroud)
正在生成错误。怎么了 它看起来像一个普通的乘法。
为了将来的访客:
这是对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)
您会看到,即使在字符串文字中也进行替换!