久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

      <bdo id='oJMbW'></bdo><ul id='oJMbW'></ul>
    <i id='oJMbW'><tr id='oJMbW'><dt id='oJMbW'><q id='oJMbW'><span id='oJMbW'><b id='oJMbW'><form id='oJMbW'><ins id='oJMbW'></ins><ul id='oJMbW'></ul><sub id='oJMbW'></sub></form><legend id='oJMbW'></legend><bdo id='oJMbW'><pre id='oJMbW'><center id='oJMbW'></center></pre></bdo></b><th id='oJMbW'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='oJMbW'><tfoot id='oJMbW'></tfoot><dl id='oJMbW'><fieldset id='oJMbW'></fieldset></dl></div>

  1. <legend id='oJMbW'><style id='oJMbW'><dir id='oJMbW'><q id='oJMbW'></q></dir></style></legend>

  2. <tfoot id='oJMbW'></tfoot>

    1. <small id='oJMbW'></small><noframes id='oJMbW'>

      站點(diǎn) coderbyte 上的“gets(stdin)"是怎么回事?

      What is going on with #39;gets(stdin)#39; on the site coderbyte?(站點(diǎn) coderbyte 上的“gets(stdin)是怎么回事?)

      <legend id='2hpXn'><style id='2hpXn'><dir id='2hpXn'><q id='2hpXn'></q></dir></style></legend>

        <small id='2hpXn'></small><noframes id='2hpXn'>

        <i id='2hpXn'><tr id='2hpXn'><dt id='2hpXn'><q id='2hpXn'><span id='2hpXn'><b id='2hpXn'><form id='2hpXn'><ins id='2hpXn'></ins><ul id='2hpXn'></ul><sub id='2hpXn'></sub></form><legend id='2hpXn'></legend><bdo id='2hpXn'><pre id='2hpXn'><center id='2hpXn'></center></pre></bdo></b><th id='2hpXn'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='2hpXn'><tfoot id='2hpXn'></tfoot><dl id='2hpXn'><fieldset id='2hpXn'></fieldset></dl></div>

      1. <tfoot id='2hpXn'></tfoot>
            <tbody id='2hpXn'></tbody>
                <bdo id='2hpXn'></bdo><ul id='2hpXn'></ul>
                本文介紹了站點(diǎn) coderbyte 上的“gets(stdin)"是怎么回事?的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

                問題描述

                Coderbyte 是一個(gè)在線編程挑戰(zhàn)網(wǎng)站(我在 2 分鐘前發(fā)現(xiàn)它).

                您遇到的第一個(gè) C++ 挑戰(zhàn)有一個(gè) C++ 框架你需要修改:

                <塊引用>

                #include #include <字符串>使用命名空間標(biāo)準(zhǔn);int FirstFactorial(int num) {//代碼在這里返回編號(hào);}int main() {//保持這個(gè)函數(shù)調(diào)用在這里cout<<FirstFactorial(gets(stdin));返回0;}

                如果您對(duì) C++ 不太熟悉,首先* 會(huì)出現(xiàn)在您的眼前:

                int FirstFactorial(int num);cout<<FirstFactorial(gets(stdin));

                所以,好的,代碼調(diào)用了 gets,它自 C++11 起已被棄用,自 C++14 起被刪除,這本身就很糟糕.

                但后來我意識(shí)到:getschar*(char*) 類型.所以它不應(yīng)該接受 FILE* 參數(shù)并且結(jié)果不應(yīng)該用于代替 int 參數(shù),但是......不僅它編譯時(shí)沒有任何警告或錯(cuò)誤,但它運(yùn)行并實(shí)際將正確的輸入值傳遞給 FirstFactorial.

                在此特定站點(diǎn)之外,代碼無法編譯(如預(yù)期),那么這里發(fā)生了什么?

                <小時(shí)>

                *實(shí)際上第一個(gè)是 using namespace std 但這與我在這里的問題無關(guān).

                解決方案

                我很好奇.所以,是時(shí)候戴上調(diào)查眼鏡了,因?yàn)槲覠o法訪問編譯器或編譯標(biāo)志,所以我需要發(fā)揮創(chuàng)造力.此外,因?yàn)檫@段代碼沒有任何意義,所以對(duì)每個(gè)假設(shè)提出質(zhì)疑并不是一個(gè)壞主意.

                首先讓我們檢查gets的實(shí)際類型.我有一個(gè)小技巧:

                模板結(jié)構(gòu)名稱;int main() {名稱n;//保持這個(gè)函數(shù)調(diào)用在這里cout<<FirstFactorial(gets(stdin));返回0;}

                這看起來……很正常:

                <塊引用>

                /tmp/613814454/Main.cpp:16:19: 警告:'gets' 已被棄用 [-Wdeprecated-declarations]名稱n;^/usr/include/stdio.h:638:37: 注意:'gets' 已在此處明確標(biāo)記為已棄用extern char *gets (char *__s) __wur __attribute_deprecated__;^/usr/include/x86_64-linux-gnu/sys/cdefs.h:254:51:注意:從宏__attribute_deprecated__"擴(kuò)展# 定義 __attribute_deprecated__ __attribute__ ((__deprecated__))^/tmp/613814454/Main.cpp:16:26: 錯(cuò)誤:未定義模板的隱式實(shí)例化 'Name'名稱n;^/tmp/613814454/Main.cpp:12:25:注意:模板在此處聲明模板<類>結(jié)構(gòu)名稱;^生成了 1 個(gè)警告和 1 個(gè)錯(cuò)誤.

                gets 被標(biāo)記為已棄用并具有簽名 char *(char *).但是,FirstFactorial(gets(stdin)); 是如何編譯的?

                讓我們試試別的:

                int main() {名稱n;//保持這個(gè)函數(shù)調(diào)用在這里cout<<FirstFactorial(gets(stdin));返回0;}

                這給了我們:

                <塊引用>

                /tmp/286775780/Main.cpp:15:21: 錯(cuò)誤:未定義模板 'Name' 的隱式實(shí)例化名稱n;^

                我們終于得到了一些東西:decltype(8).所以整個(gè) gets(stdin) 被文本替換為輸入 (8).

                事情變得更奇怪了.編譯器錯(cuò)誤繼續(xù):

                <塊引用>

                /tmp/596773533/Main.cpp:18:26: 錯(cuò)誤:沒有匹配的函數(shù)調(diào)用gets"cout<<FirstFactorial(gets(stdin));^~~~/usr/include/stdio.h:638:14:注意:候選函數(shù)不可行:第一個(gè)參數(shù)沒有從struct _IO_FILE *"到char *"的已知轉(zhuǎn)換extern char *gets (char *__s) __wur __attribute_deprecated__;

                所以現(xiàn)在我們得到了 cout << 的預(yù)期錯(cuò)誤.FirstFactorial(gets(stdin));

                我檢查了一個(gè)宏,因?yàn)?#undef gets 似乎什么都不做,所以它看起來不是一個(gè)宏.

                但是

                std::integral_constantn;

                它編譯.

                但是

                std::integral_constantn;//行std::integral_constantn2;//錯(cuò)誤 wtf??

                n2 行沒有出現(xiàn)預(yù)期的錯(cuò)誤.

                再說一次,幾乎對(duì) main 的任何修改都會(huì)使 cout <<FirstFactorial(gets(stdin)); 吐出預(yù)期的錯(cuò)誤.

                此外,stdin 實(shí)際上似乎是空的.

                所以我只能得出結(jié)論并推測他們有一個(gè)小程序可以解析源代碼并嘗試(很差)在將 gets(stdin) 替換為測試用例輸入值之前實(shí)際將其輸入編譯器.如果有人有更好的理論或?qū)嶋H知道他們在做什么,請分享!

                這顯然是一種非常糟糕的做法.在研究這個(gè)時(shí),我發(fā)現(xiàn)這里至少有一個(gè)問題(example) 關(guān)于這一點(diǎn),因?yàn)槿藗儾恢烙幸粋€(gè)網(wǎng)站在那里做這件事,他們的答案是不要使用 gets 而是使用 ...".這確實(shí)是一個(gè)很好的建議,但只會(huì)讓 OP 更加困惑,因?yàn)槿魏螐?stdin 進(jìn)行有效讀取的嘗試都將在此站點(diǎn)上失敗.


                TLDR

                gets(stdin) 是無效的 C++.這是這個(gè)特定網(wǎng)站使用的噱頭(我不知道是什么原因).如果你想繼續(xù)在網(wǎng)站上提交(我既不認(rèn)可也不不認(rèn)可它)你必須使用這個(gè)結(jié)構(gòu),否則就沒有意義,但要注意它是脆弱的.幾乎對(duì) main 的任何修改都會(huì)拋出錯(cuò)誤.在本站之外使用正常的輸入閱讀方法.

                Coderbyte is an online coding challenge site (I found it just 2 minutes ago).

                The first C++ challenge you are greeted with has a C++ skeleton you need to modify:

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

                So, ok, the code calls gets which is deprecated since C++11 and removed since C++14 which is bad in itself.

                But then I realize: gets is of type char*(char*). So it shouldn't accept a FILE* parameter and the result shouldn't be usable in the place of an int parameter, but ... not only it compiles without any warnings or errors, but it runs and actually passes the correct input value to FirstFactorial.

                Outside of this particular site, the code doesn't compile (as expected), so what is going on here?


                *Actually the first one is using namespace std but that is irrelevant to my issue here.

                解決方案

                I am intrigued. So, time to put the investigation goggles on and since I don't have access to the compiler or compilation flags I need to get inventive. Also because nothing about this code makes sense it's not a bad idea question every assumption.

                First let's check the actual type of gets. I have a little trick for that:

                template <class> struct Name;
                
                int main() { 
                    
                    Name<decltype(gets)> n;
                  
                  // keep this function call here
                  cout << FirstFactorial(gets(stdin));
                  return 0;
                    
                }
                

                And that looks ... normal:

                /tmp/613814454/Main.cpp:16:19: warning: 'gets' is deprecated [-Wdeprecated-declarations]
                    Name<decltype(gets)> n;
                                  ^
                /usr/include/stdio.h:638:37: note: 'gets' has been explicitly marked deprecated here
                extern char *gets (char *__s) __wur __attribute_deprecated__;
                                                    ^
                /usr/include/x86_64-linux-gnu/sys/cdefs.h:254:51: note: expanded from macro '__attribute_deprecated__'
                # define __attribute_deprecated__ __attribute__ ((__deprecated__))
                                                                  ^
                /tmp/613814454/Main.cpp:16:26: error: implicit instantiation of undefined template 'Name<char *(char *)>'
                    Name<decltype(gets)> n;
                                         ^
                /tmp/613814454/Main.cpp:12:25: note: template is declared here
                template <class> struct Name;
                                        ^
                1 warning and 1 error generated.
                

                gets is marked as deprecated and has the signature char *(char *). But then how is FirstFactorial(gets(stdin)); compiling?

                Let's try something else:

                int main() { 
                  Name<decltype(gets(stdin))> n;
                  
                  // keep this function call here
                  cout << FirstFactorial(gets(stdin));
                  return 0;
                    
                } 
                

                Which gives us:

                /tmp/286775780/Main.cpp:15:21: error: implicit instantiation of undefined template 'Name<int>'
                  Name<decltype(8)> n;
                                    ^
                

                Finally we are getting something: decltype(8). So the entire gets(stdin) was textually replaced with the input (8).

                And the things get weirder. The compiler error continues:

                /tmp/596773533/Main.cpp:18:26: error: no matching function for call to 'gets'
                  cout << FirstFactorial(gets(stdin));
                                         ^~~~
                /usr/include/stdio.h:638:14: note: candidate function not viable: no known conversion from 'struct _IO_FILE *' to 'char *' for 1st argument
                extern char *gets (char *__s) __wur __attribute_deprecated__;
                

                So now we get the expected error for cout << FirstFactorial(gets(stdin));

                I checked for a macro and since #undef gets seems to do nothing it looks like it isn't a macro.

                But

                std::integral_constant<int, gets(stdin)> n;
                

                It compiles.

                But

                std::integral_constant<int, gets(stdin)> n;    // OK
                std::integral_constant<int, gets(stdin)> n2;   // ERROR                                          wtf??
                

                Doesn't with the expected error at the n2 line.

                And again, almost any modification to main makes the line cout << FirstFactorial(gets(stdin)); spit out the expected error.

                Moreover the stdin actually seems to be empty.

                So I can only conclude and speculate they have a little program that parses the source and tries (poorly) to replace gets(stdin) with the test case input value before actually feeding it into the compiler. If anybody has a better theory or actually knows what they are doing please share!

                This is obviously a very bad practice. While researching this I found there is at least a question here (example) about this and because people have no idea that there is a site out there who does this their answer is "don't use gets use ... instead" which is indeed a good advice but only confuses the OP more since any attempt at a valid read from stdin will fail on this site.


                TLDR

                gets(stdin) is invalid C++. It's a gimmick this particular site uses (for what reasons I cannot figure out). If you want to continue to submit on the site (I am neither endorsing it neither not endorsing it) you have to use this construct that otherwise would not make sense, but be aware that it is brittle. Almost any modifications to main will spit out an error. Outside of this site use normal input reading methods.

                這篇關(guān)于站點(diǎn) coderbyte 上的“gets(stdin)"是怎么回事?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

                【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

                相關(guān)文檔推薦

                read input files, fastest way possible?(讀取輸入文件,最快的方法?)
                The easiest way to read formatted input in C++?(在 C++ 中讀取格式化輸入的最簡單方法?)
                Reading from .txt file into two dimensional array in c++(從 .txt 文件讀取到 C++ 中的二維數(shù)組)
                How to simulate a key press in C++(如何在 C++ 中模擬按鍵按下)
                Why doesn#39;t getline(cin, var) after cin.ignore() read the first character of the string?(為什么在 cin.ignore() 之后沒有 getline(cin, var) 讀取字符串的第一個(gè)字符?)
                What is the cin analougus of scanf formatted input?(scanf 格式輸入的 cin 類比是什么?)
                  <bdo id='0YFe3'></bdo><ul id='0YFe3'></ul>
                  <i id='0YFe3'><tr id='0YFe3'><dt id='0YFe3'><q id='0YFe3'><span id='0YFe3'><b id='0YFe3'><form id='0YFe3'><ins id='0YFe3'></ins><ul id='0YFe3'></ul><sub id='0YFe3'></sub></form><legend id='0YFe3'></legend><bdo id='0YFe3'><pre id='0YFe3'><center id='0YFe3'></center></pre></bdo></b><th id='0YFe3'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='0YFe3'><tfoot id='0YFe3'></tfoot><dl id='0YFe3'><fieldset id='0YFe3'></fieldset></dl></div>

                      <tbody id='0YFe3'></tbody>
                    <legend id='0YFe3'><style id='0YFe3'><dir id='0YFe3'><q id='0YFe3'></q></dir></style></legend>

                        <small id='0YFe3'></small><noframes id='0YFe3'>

                      1. <tfoot id='0YFe3'></tfoot>

                          主站蜘蛛池模板: 男女又爽又黄视频 | 国产美女永久免费无遮挡 | 国产9999精品| 国产精品久久久久久久久久免费 | 男女黄网站 | 韩国毛片一区二区三区 | 国产乱码精品一品二品 | 日韩欧美在线一区 | 国产三级国产精品 | 日韩免费看片 | 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 波多野结衣一区二区三区在线观看 | 一级黄色毛片子 | 激情在线视频 | 免费精品视频一区 | 欧美影院 | 欧美激情一区二区三区 | 成人精品久久 | 一区二区三区国产在线观看 | 日韩免费视频一区二区 | 久久精品91久久久久久再现 | 亚洲久久一区 | 紧缚调教一区二区三区视频 | 91av精品| 蜜桃色网| 免费黄色的网站 | 黄色网址在线播放 | 中文字幕一区二区三区不卡 | 久久国产精品色av免费观看 | 亚洲精品二区 | 欧美精品一区二区三区蜜臀 | 欧美一级黄 | 日韩欧美精品一区 | 波波电影院一区二区三区 | 国产激情 | 亚洲日韩视频 | 久久久高清 | 成年人网站国产 | www4虎| 精品国产欧美一区二区三区成人 | 一级黄色片免费在线观看 |