gets_s只能在VS里用吗?

本人小Bai刚开始学,今天偶然发现还有get_s这个函数,但是在dev cpp和QT上都试了一下,发现不管怎么改都是会报错,网上的代码直接copy下来也还是报错。后来偶然间看到,好像gets_s只能在VS里用,想问一下各位老哥,是不是这样的

函数名后有_s是vs特有的,有些其他编译器也支持。
从C11开始gets已经被淘汰了,改为了gets_s。因此你的编译器要支持c11,编译参数添加-std=c11。
推荐使用fgets

后辈总自以为比前辈进步,其实很多情况下都是退步。

类库版本不一样,低版本只支持gets,高版本gets会报错不安全,必须使用gets_s,或者在define里声明不报错

可以在vs中设置一下,就可以用get了,这个跟vs中的安全规范有关

你可以封装一下支持所有编译器

#include <stdio.h>
#include <string.h>

char *my_gets(char *buffer, size_t size)
{
#if defined(_MSC_VER) && _MSC_VER >= 1928
    // For VS2019 16.8 and later versions
    return gets_s(buffer, size);
#elif __cplusplus >= 201103L || __STDC_VERSION__ >= 201112L
    // For C11 enabled compilers
    fgets(buffer, size, stdin);
    // Remove the newline in the buffer.
    char *p = buffer + strlen(buffer) - 1;
    if (*p == '\n')
        *p = '\0';
    return buffer;
#else
    // Fallback
    return gets(buffer);
#endif
}

int main()
{
    const int BUFFER_SIZE = 255;
    char buffer[BUFFER_SIZE];
    my_gets(buffer, BUFFER_SIZE);
    puts(buffer);
    return 0;
}