如何修复C++14中gets函数‘char*无法转换为FILE*’错误
修复C++14中gets函数的编译错误及内存问题
问题根源
- gets函数已被废弃:gets在C11中被标记为废弃,C17中完全从标准库移除。现代编译器会拒绝它的使用,你遇到的“无法将‘char*’转换为‘FILE*’”错误,是因为编译器的头文件中不再提供标准的gets定义,可能误匹配到了其他参数为FILE*的函数(比如你尝试替换的getw,是用于从文件流读取整数的,完全不适合读取字符串)。
- 未初始化的野指针:你的
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
相关产品推荐
相关产品推荐

