C++中std::string::compare()返回值异常问题求助
C++测验程序答案匹配问题排查
问题场景
我是C++新手,开发了一个读取问答文本文件的测验程序,文件格式示例:
Q: How many days in a week?
A: seven
程序包含main.cpp、Quiz.cpp和Quiz.h三个文件,代码如下:
main.cpp
#include <iostream> #include <vector> #include <fstream> #include <algorithm> #include <ctime> #include <cstdlib> #include "Quiz.h" using namespace std; int main(int argc, char* argv[]){ srand(unsigned(time(0))); vector<Quiz> quizVector; ifstream inputQuiz; inputQuiz.open(argv[1]); string q, a; int questionCount = 0; if(inputQuiz.is_open()){ getline(inputQuiz, q); getline(inputQuiz, a); while(!inputQuiz.eof()){ Quiz *instance = new Quiz(q, a); quizVector.push_back(*instance); questionCount++; getline(inputQuiz, q); getline(inputQuiz, a); } } random_shuffle(quizVector.begin(), quizVector.end()); string userInput; for(int i = 0; i < questionCount; i++){ cout << quizVector[i].getQuestion() << endl; cout << "A: "; getline(cin, userInput); if(quizVector[i].getAnswer().compare("A: " + userInput) == 0){ cout << "Correct." << endl; } else{ cout << "Incorrect." << endl; } } return 0; }
Quiz.cpp
#include <string> #include "Quiz.h" int Quiz::score = 0; std::string Quiz::getQuestion(){ return question; } std::string Quiz::getAnswer(){ return answer; }
Quiz.h
#ifndef QUIZ_H #define QUIZ_H class Quiz{ private: std::string question {""}; std::string answer {""}; public: Quiz() = default; Quiz(std::string q, std::string a) : question {q}, answer {a} {} std::string getQuestion(); std::string getAnswer(); }; #endif
遇到的问题
问题出在main.cpp的这段代码:
for(int i = 0; i < questionCount; i++){ cout << quizVector[i].getQuestion() << endl; cout << "A: "; getline(cin, userInput); if(quizVector[i].getAnswer().compare("A: " + userInput) == 0){ cout << "Correct." << endl; } else{ cout << "Incorrect." << endl; } }
当输入对应问题的正确答案时,std::string::compare()始终返回1而非0,文本文件每行无首尾空格,疑惑是否误解了getline()或compare()的用法。
问题原因与解决方案
核心问题
- 字符串拼接错误:
"A: " + userInput写法不合法。"A: "是C风格字符串(const char*),无法直接和std::string用+运算符拼接,这会触发指针偏移运算,生成一个无效的内存地址,最终和存储的答案字符串完全不匹配。 - 潜在输入残留问题:程序运行时,
cin缓冲区可能残留换行符,导致第一次getline读取到空字符串,影响后续匹配。
修复步骤
修正字符串拼接逻辑
把C风格字符串转为std::string后再拼接,有两种写法:// 方式1:用std::string字面量(C++11+) if(quizVector[i].getAnswer() == "A: "s + userInput) {// 方式2:显式构造std::string std::string expectedAnswer = std::string("A: ") + userInput; if(quizVector[i].getAnswer().compare(expectedAnswer) == 0) {处理输入残留换行
如果发现第一次getline读取空内容,在循环前添加代码清空缓冲区:#include <limits> // 需包含此头文件 // 忽略缓冲区中所有字符直到换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n');修复内存泄漏
原代码中new Quiz(q,a)创建堆对象但未释放,直接用栈对象即可:quizVector.push_back(Quiz(q, a)); // 替代原有的 new 和 push_back(*instance)
修复后的关键代码片段
#include <limits> // 添加此头文件 // ... 其他代码 ... string userInput; // 清除缓冲区残留的换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); for(int i = 0; i < questionCount; i++){ cout << quizVector[i].getQuestion() << endl; cout << "A: "; getline(cin, userInput); std::string expectedAnswer = std::string("A: ") + userInput; if(quizVector[i].getAnswer().compare(expectedAnswer) == 0){ cout << "Correct." << endl; } else{ cout << "Incorrect." << endl; } }
内容的提问来源于stack exchange,提问作者glwhitaker2
相关产品推荐
相关产品推荐

