coderbyte 网站上的“gets(stdin)”是怎么回事?

2023-12-01

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(使用前将#替换为@)

coderbyte 网站上的“gets(stdin)”是怎么回事? 的相关文章

随机推荐