Coderbyte 是一个在线编码挑战网站(我两分钟前才发现它)。
第一个 C++ 挑战你会看到一个需要修改的 C++ 框架:
#include <iostream>
#include <string>
using namespace std;
int FirstFactorial(int num) {
// Code goes here
return num;
}
int main() {
// Keep this function call here
cout << FirstFactorial(gets(stdin));
return 0;
}
If you are little familiar with C++ the first thing* that pops in your eyes is:
int FirstFactorial(int num);
cout << FirstFactorial(gets(stdin));
所以,好的,代码调用gets
自 C++11 起已弃用,自 C++14 起已删除,这本身就是不好的。
但后来我意识到:gets
属于类型char*(char*)
。所以它不应该接受FILE*
参数和结果不应该用来代替int
参数,但是......它不仅编译时没有任何警告或错误,而且它运行并实际上将正确的输入值传递给FirstFactorial
.
在这个特定站点之外,代码无法编译(如预期),那么这里发生了什么?
*Actually the first one is using namespace std
but that is irrelevant to my issue here.
我是 Coderbyte 的创始人,也是创建这个的人gets(stdin)
hack.
这篇文章的评论是正确的,它是一种查找和替换的形式,所以让我解释一下为什么我很快就这样做了。
早在我第一次创建该网站的那天(大约 2012 年),它只支持 JavaScript。在浏览器中运行的 JavaScript 中无法“读取输入”,因此会有一个函数foo(input)
我用了readline()
Node.js 中的函数可以像这样调用它foo(readline())
。只是我还是个孩子,不太了解,所以我实际上只是替换了readline()
与运行时的输入。所以foo(readline())
became foo(2)
or foo("hello")
对于 JavaScript 来说效果很好。
大约在 2013/2014 年,我添加了更多语言并使用第三方服务在线评估代码,但是用我正在使用的服务执行 stdin/stdout 非常困难,所以我坚持对语言进行同样愚蠢的查找和替换例如 Python、Ruby,以及最终的 C++、C# 等。
快进到今天,我在自己的容器中运行代码,但从未更新 stdin/stdout 的工作方式,因为人们已经习惯了这种奇怪的黑客行为(有些人甚至在论坛上发帖解释如何绕过它)。
我知道这不是最佳实践,对于学习新语言的人来说看到这样的黑客没有帮助,但这个想法是让新程序员根本不用担心读取输入,而只专注于编写算法来解决问题问题。几年前,关于编码挑战网站的一个常见抱怨是,新程序员会花费大量时间来弄清楚如何阅读stdin
或者从文件中读取行,所以我希望新的编码人员能够避免 Coderbyte 上的这个问题。
我将很快更新整个编辑器页面以及默认代码和stdin
阅读语言。希望 C++ 程序员会更喜欢使用 Coderbyte :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)