You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复C++14中gets函数‘char*无法转换为FILE*’错误

修复C++14中gets函数的编译错误及内存问题

问题根源

  1. gets函数已被废弃:gets在C11中被标记为废弃,C17中完全从标准库移除。现代编译器会拒绝它的使用,你遇到的“无法将‘char*’转换为‘FILE*’”错误,是因为编译器的头文件中不再提供标准的gets定义,可能误匹配到了其他参数为FILE*的函数(比如你尝试替换的getw,是用于从文件流读取整数的,完全不适合读取字符串)。
  2. 未初始化的野指针:你的color、material、marca是未分配内存的char指针,即使gets能编译,运行时也会因为访问非法内存直接崩溃。

修复方案

方案1:使用char数组+cin.getline(兼容C风格)

将类中的char指针改为固定大小的char数组,用cin.getline读取字符串,同时处理cin>>precio留下的换行符:

#include<iostream>
#include<limits> // 用于处理输入缓冲区的ignore操作

using namespace std;

class Maleta{
private:
    char color[50];       // 改为固定大小的char数组
    char material[50];
    char marca[50];
    int precio;
    
public:
    void entrada(void);
    void proceso(void);
    void salida(void);
};

void Maleta::entrada()
{
    cout<<"de color:"<<endl;
    cin.getline(color, sizeof(color)); // 使用cin.getline读取字符串
    cout<<"de material:"<<endl;
    cin.getline(material, sizeof(material));
    cout<<"de marca:"<<endl;
    cin.getline(marca, sizeof(marca));
    cout<<"de precio:"<<endl;
    cin>>precio;
    
    // 处理cin>>留下的换行符,避免后续输入被跳过
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

void Maleta::salida(void)
{
    cout<<"color :"<<color<<endl;
    cout<<"material :"<<material<<endl;
    cout<<"marca :" <<marca<<endl;
    cout<<"precio :"<<precio<<endl;
}

int main()
{
    Maleta morral;
    morral.entrada();
    morral.salida();
}

方案2:使用std::string(推荐,更符合C++风格)

直接用std::string代替char指针,无需手动管理内存,输入更简单:

#include<iostream>
#include<string> // 必须包含string头文件
#include<limits>

using namespace std;

class Maleta{
private:
    string color;       // 替换char*为string
    string material;
    string marca;
    int precio;
    
public:
    void entrada(void);
    void proceso(void);
    void salida(void);
};

void Maleta::entrada()
{
    cout<<"de color:"<<endl;
    getline(cin, color); // 用getline读取带空格的字符串
    cout<<"de material:"<<endl;
    getline(cin, material);
    cout<<"de marca:"<<endl;
    getline(cin, marca);
    cout<<"de precio:"<<endl;
    cin>>precio;
    
    // 处理cin>>留下的换行符
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

void Maleta::salida(void)
{
    cout<<"color :"<<color<<endl;
    cout<<"material :"<<material<<endl;
    cout<<"marca :" <<marca<<endl;
    cout<<"precio :"<<precio<<endl;
}

int main()
{
    Maleta morral;
    morral.entrada();
    morral.salida();
}

关键说明

  • 如果不需要读取带空格的字符串,方案2中也可以直接用cin>>color,这样无需处理换行符,但无法读取包含空格的输入。
  • 永远不要使用gets,它没有边界检查,会导致缓冲区溢出,是严重的安全隐患。

内容的提问来源于stack exchange,提问作者hirof

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 14:53:28