• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Dev-C++下使用scanf("lld", nX)讀取long long時出現的bug

               首先,要再現bug得先準備bug條件,使用Windows下的Dev-C++按照目錄下bin文件夾下面的c和c++編譯器和鏈接器,可以直接使用Dev-C++,或者用CodeBlocks然后編譯鏈接的目錄設置為Dev-C++的bin目錄。這個bug是在今天月賽時候出現的,我用%lld讀入一個不大的整數后,再for循環讀入其它一些數字,發現無論如何輸出不了,而我用cin和cout操作longlong的時候,超時1倍多,很惡心的出題人,本來就是一個水題,居然做成這樣。然后沒辦法,快結束的時候,問旁邊的隊友,因為是個人賽,所以是自己在做,longlong,如何讀入,他說%lld。是啊,我一直這樣讀,這樣輸出,為啥出問題了。。。沒辦法照著他的樣子,把輸入改成了int,直接%d讀入,答案還是longlong,再%lld輸出就沒超時了,真惡心的一天啊。    
               64位本來就用得不多,而且對于大多數Windows下的用戶,基本都是vc6和vs08什么的。vs08我已經實驗過,不會出現這個bug,PS:是完全一樣的代碼,親自單步調試實驗的,無任何bug。vc6只能用%I64d輸入和輸出。那么,問題就只是在Dev-C++的用戶中存在了。   回來的時候,我就決心找出問題的所在。所以,我打算升級g++的版本。下了個Dev-C++ 5.0也沒用,和前面的Dev-C++ 4.9.9.2一樣的,惡心啊。
                 然后google+百度了很久,發現CSDN上一篇博文解釋說,這就是Dev-C++自己的事情。因為gcc本來是linux下的,所以longlong在自己家里是不會出現問題的。而Dev-C++是把人家移植過來的,那篇博文說Dev-C++的編譯和鏈接器是mingw32-g++.exe,但是Mingw32在編譯期間使用gcc的規則檢查語法,在連接和運行時使用的卻是Microsoft庫。這個庫里的printf和scanf函數當然不認識linux gcc下"%lld"和"%llu",對"%I64d"和"%I64u",它則是樂意接受的。Mingw32在編譯期間使用gcc的規則檢查語法,在連接和運行時使用的卻是Microsoft庫。這個庫里的printf和scanf函數當然不認識linux gcc下"%lld"和"%llu",對"%I64d"和"%I64u",它則是樂意接受的。意思是,程序里面實質的二進制代碼可能是微軟的庫,只解析%I64d,然后就可能出錯了。具體是什么原因,只有開發Dev-C++的人知道了。或者其它高人。。。

            #include <stdio.h>
            #include <iostream>
            using namespace std;

            int main()
            {
                long long nN;
                long long nX, nY;

                if (scanf("%lld", &nN) != EOF)
                {
                    printf("nN:%lld\n", nN);
                    
                    for (long long i = 0; i < nN; ++i)
                    {
                        printf("nN:%lld i:%lld\n", nN, i);
                    }
                    getchar();
                    printf("Over\n");
                }

                return 0;
            }


            該代碼會一直死循環,大家可以試試


            如果改成下面這樣,還可以看到輸入的數據都沒有到達指定的變量
            #include <stdio.h>
            #include <iostream>
            using namespace std;
            int main()
            {
                long long nN;
                long long nX, nY;
                
                if (scanf("%lld", &nN) != EOF)
                {
                    printf("nN:%lld\n", nN);
                    
                    for (long long i = 0; i < nN; ++i)
                    {
                        printf("nN:%lld i:%lld\n", nN, i);
                        scanf("%lld %lld", &nX, &nY);
                        printf("nX:%lld nY:%lld\n", nX, nY);
                    }
                    getchar();
                    printf("Over\n");
                }
                return 0;
            }

            posted on 2011-12-11 18:20 yx 閱讀(5384) 評論(11)  編輯 收藏 引用 所屬分類: C++

            評論

            # re: Dev-C++下使用scanf("lld", nX)讀取long long時出現的bug 2011-12-11 18:59 泡菜

            C99里面的long longC++98里是木有的,只是大多數編譯器,擴展支持(C++2011里正式支持),有些庫是用的宏。。。。貌似Dev-C++用的是GCC3.X的編譯器,mingw庫也比較老,干嗎不試試這個---TDM-GCC ???
            最新版本為 4.6.1,32位64位都有,它與CodeBlocks整合的很好  回復  更多評論   

            # re: Dev-C++下使用scanf("lld", nX)讀取long long時出現的bug 2011-12-11 19:04 泡菜

            另,提醒聲C里面的printf和scanf函數屬于不太安全的函數,用的時候小心,相關資料可以參看,看雪的Oday書。。。
            好好的C++ Code干嗎用這兩個函數泥?std::cout std::endl不能解決問題木?。。。唉!  回復  更多評論   

            # re: Dev-C++下使用scanf("lld", nX)讀取long long時出現的bug 2011-12-11 19:08 泡菜

            最后: GCC for Window不鏈接微軟的庫,未必還鏈接其他操作系統的庫木?微軟的可執行文件為PE格式,Linux是ELF格式。。。。。  回復  更多評論   

            # re: Dev-C++下使用scanf("lld", nX)讀取long long時出現的bug 2011-12-11 21:41 遠行

            當然是不能解決問題,我才用這種函數的,cin和cout消耗的時間是scanf和printf的2倍不止。。。@泡菜
              回復  更多評論   

            # re: Dev-C++下使用scanf("lld", nX)讀取long long時出現的bug 2011-12-11 21:43 遠行

            我難道不知道是PE格式,我還分析過PE寫過病毒了,微軟自己實現了套C和C++庫,你不會不知道吧,和gcc,g++版本是不同的@泡菜
              回復  更多評論   

            # re: Dev-C++下使用scanf("lld", nX)讀取long long時出現的bug 2011-12-11 22:38 遠行

            很不幸的是我剛按照了TDM-gcc最新版本4.61,然后用CodeBlocks關聯,該問題同樣存在,不過謝謝你推薦了這個編譯器@泡菜
              回復  更多評論   

            # re: Dev-C++下使用scanf("lld", nX)讀取long long時出現的bug 2011-12-12 10:20 coolypf

            @遠行
            與gcc無關,
            是libc的問題(即msvcrt)
            最新的版本是支持%lld的  回復  更多評論   

            # re: Dev-C++下使用scanf("lld", nX)讀取long long時出現的bug 2011-12-12 13:13 泡菜

            cin和cout消耗的時間是scanf和printf的2倍不止。。。。拿你木語言老

            有空推薦看看,編譯器實現方面的書,CRT的實現方面。。。
            在C++鑲嵌C要小心


              回復  更多評論   

            # re: Dev-C++下使用scanf("lld", nX)讀取long long時出現的bug 2011-12-12 15:27 遠行

            是啊,所以我在文章里面的說法是對的,鏈接庫里面實際上是微軟實現的@coolypf
              回復  更多評論   

            # re: Dev-C++下使用scanf("lld", nX)讀取long long時出現的bug 2011-12-12 15:28 遠行

            c++里面也有scanf和printf,也不能說得上鑲嵌吧@泡菜
              回復  更多評論   

            # re: Dev-C++下使用scanf("lld", nX)讀取long long時出現的bug 2011-12-21 12:50 ->->

            @泡菜
            這是在寫ACM代碼,沒有安全不安全可言。  回復  更多評論   

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導航

            統計

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學

            網友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品无码一区二区三区日韩| 伊人丁香狠狠色综合久久| 伊人久久大香线焦综合四虎| 看久久久久久a级毛片| 香蕉久久永久视频| 一本色道久久综合| 久久久久无码国产精品不卡| 久久国产精品免费一区| 久久伊人影视| 日韩精品久久久久久久电影| 一本一本久久a久久精品综合麻豆| 久久久久亚洲精品中文字幕| 久久久久国产| 久久久SS麻豆欧美国产日韩| 久久强奷乱码老熟女网站| 综合人妻久久一区二区精品| 麻豆一区二区99久久久久| 亚洲αv久久久噜噜噜噜噜| 久久精品水蜜桃av综合天堂 | 久久伊人五月丁香狠狠色| 国产精品久久久香蕉| 人妻精品久久无码专区精东影业 | 国产精品天天影视久久综合网| av午夜福利一片免费看久久| 99久久99这里只有免费费精品| 国产激情久久久久影院| 中文字幕无码久久精品青草 | 国内精品免费久久影院| 久久亚洲国产成人影院网站| 综合久久国产九一剧情麻豆| 久久国产亚洲精品麻豆| 一级a性色生活片久久无| 精品国产乱码久久久久久郑州公司| 久久国产乱子伦精品免费强| 国产69精品久久久久APP下载| 国内精品久久国产大陆| 香蕉久久AⅤ一区二区三区| 韩国无遮挡三级久久| 久久中文字幕人妻熟av女| 国产福利电影一区二区三区久久久久成人精品综合| 亚洲国产成人乱码精品女人久久久不卡 |