windows中的getchar_unlocked未声明

时间:2012-10-22 11:28:05

标签: c++ scanf

Here是我的代码。我提供问题的来源,因为它不是那么大:

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

我知道这里定义的函数scanscanf快,对编程竞赛非常有用。但由于某种原因,这段代码不适用于Windows,而且正在使用Linux。我该怎么做才能让它在Windows上运行。我正在使用g++的{​​{1}}编译器。

3 个答案:

答案 0 :(得分:3)

getchar_unlocked不是C或C ++标准函数,因此它在Windows上不起作用也就不足为奇了。我认为这是一个POSIX标准,但Windows编译器不支持所有POSIX功能。

如果您将getchar_unlocked替换为getchar,它会起作用,尽管算法看起来不太合适。

您可以使用条件编译来完成此操作,例如

#ifdef _WINDOWS
// no getchar_unlocked on Windows so just call getchar
inline int getchar_unlocked() { return getchar(); }
#endif

答案 1 :(得分:0)

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

答案 2 :(得分:0)

quotes_spider主要用于竞争性编程,但是,如果您想在其他地方使用它,请确保一次只有1个线程正在使用它。 同样适用于putchar_unlocked()函数。 它是POSIX等价物,因此Windows编译器不支持它。 但是,您可以使用两个中的任何一个 -

1)正常速度

getchar_unlocked()

2)速度快

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