XCODE下C++调用getline报错no matching function for call to 'getline'求助
报错核心原因
- 头文件引用错误:你引入的
<string.h>是C语言的字符串操作库,C++标准库的getline函数定义在<string>头文件中,未引入该头文件会找不到函数定义。 getline参数不匹配:- 标准
std::getline第二个参数要求是std::string类型,你结构体中name、date是char数组,类型不兼容。 - 第三个分隔符参数要求是
char类型,你传入的是双引号包裹的字符串"\n",应该用单引号的'\n',且getline默认分隔符就是换行,可省略该参数。 mark是int类型,getline无法直接读取整型变量,类型不匹配。
- 标准
- 输入缓冲区残留问题:你之前用
cin >> insertion读取数字时,输入结束后按下的换行符会残留在输入缓冲区,后续直接调用getline会优先读取到空行,无法正常获取用户输入。 - 额外逻辑错误:
MovePreviousExam函数中循环初始值设为MAX_EXAMS,直接访问exams[MAX_EXAMS]会造成数组越界,数组合法下标范围是0 ~ MAX_EXAMS-1。
修复方案
修改后的可运行代码如下,可正常读取带空格的考试名称、日期:
#include <iostream> #include <string> // 替换原来的<string.h> #include <limits> // 用于清空输入缓冲区 #define MAX_EXAMS 30 using namespace std; typedef struct exam{ string name; // 改为C++ string类型适配getline string date; int mark; }exam_t; exam_t exams[MAX_EXAMS]; void MovePreviousExam(){ exam_t last = exams[MAX_EXAMS - 1]; for (int i = MAX_EXAMS - 1; i > 0; i--) { // 修改循环初始值避免越界 exams[i] = exams[i - 1]; } exams[0] = last; } int main() { bool doesUserWantToViewExams = false; bool doesUserWantToEnterExam = false; int insertion = 0; do { cout << "You want to view exams? Press 1.\nYou want to enter an exam? Press 2.\nYou want to close program? Press 3.\n"; cin >> insertion; // 每次用cin读取数字后清空缓冲区残留的换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); doesUserWantToViewExams = false; doesUserWantToEnterExam = false; if (insertion == 1) { doesUserWantToViewExams = true; }else if(insertion == 2){ doesUserWantToEnterExam = true; }else if(insertion == 3){ cout << "Goodbye :)\n"; }else{ cout << "Unkown Value, try again.\n"; } if (doesUserWantToViewExams) { cout << "Here are your exams:\n"; // 可自行补充遍历输出exams数组的逻辑 } if (doesUserWantToEnterExam) { MovePreviousExam(); cout << "Enter your exam's name, date and grade in this order:\n"; getline(cin, exams[0].name); // 省略默认换行分隔符 getline(cin, exams[0].date); cin >> exams[0].mark; // 整型直接用cin读取即可 cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 读取完分数后清空残留换行,避免下次循环出问题 } } while (insertion != 3); return 0; }
补充说明
如果你坚持要使用char数组存储名称和日期,可以将getline替换为cin.getline(exams[0].name, 100),不需要修改头文件也可以正常使用。
内容的提问来源于stack exchange,提问作者Armando
相关产品推荐
相关产品推荐

