4

これが私のコードです:

#include <stdio.h>

void scan(int* i)
{
    int t=0;
    char c;
    bool negative=false;
    c=getchar_unlocked();
    while(c<'0'&&c>'9')
    {
        if(c=='-')
            negative=true;
        c=getchar_unlocked();
    }
    while(c>'0'&&c<'9')
    {
        t=(t<<3)+(t<<1)+c-'0';
        c=getchar_unlocked();
    }
    if(negative)
        t=~(t-1); //negative
    *i=t;
}

int main(int argc, char const *argv[])
{
    int i;
    scan(&i);
    return 0;
}

ここで定義されている関数は、プログラミングコンテストscanよりも高速で、非常に便利です。scanfしかし、何らかの理由で、このコードはWindowsでは機能せず、Linuxでも機能します。Windowsで動作させるにはどうすればよいですか?g++Dev-C++のコンパイラを使用しています。

4

3 に答える 3

5

getchar_unlockedはCまたはC++の標準関数ではないため、Windowsで機能しないのは当然です。これはPOSIX標準だと思いますが、WindowsコンパイラはすべてのPOSIX機能をサポートしているわけではありません。

に置き換えた場合getchar_unlockedgetcharアルゴリズムは完全に正しくないように見えますが、それは一種の作業になります。

たとえば、このように条件付きコンパイルでこれを行うことができます

#ifdef _WINDOWS
// no getchar_unlocked on Windows so just call getchar
inline int getchar_unlocked() { return getchar(); }
#endif
于 2012-10-22T11:38:06.087 に答える
2

Windowsには同等の_getchar_nolockがあり、これはWindows固有です。

このリンクを参照してください:

https://msdn.microsoft.com/en-us/library/4y2e9z0c.aspx

したがって、スレッドセーフでないバージョンに満足していて、可能な限り最高のパフォーマンスが必要な場合は、次のようにすることができます。

#ifdef WIN32
// no getchar_unlocked on Windows so call _getchar_nolock
inline int getchar_unlocked() { return _getchar_nolock(); }
#endif
于 2017-11-11T23:06:22.567 に答える
0

getchar_unlocked()は主に競技プログラミングに使用されますが、これを他の場所で使用する場合は、一度に1つのスレッドのみが使用していることを確認してください。同じことがputchar_unlocked()関数にも当てはまります。これはPOSIXと同等であるため、Windowsコンパイラはサポートしていません。ただし、次の2つのいずれかを使用できます-

  1. 通常の速度

    int getchar_unlocked(){return getchar(); } void putchar_unlocked(char _c){putchar(_c); }

  2. 速いスピード

    int getchar_unlocked(){return _getchar_nolock(); } void putchar_unlocked(char _c){_putchar_nolock(_c); }

于 2018-03-09T18:37:24.357 に答える