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

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()的用法。


问题原因与解决方案

核心问题

  1. 字符串拼接错误:"A: " + userInput 写法不合法。"A: "是C风格字符串(const char*),无法直接和std::string用+运算符拼接,这会触发指针偏移运算,生成一个无效的内存地址,最终和存储的答案字符串完全不匹配。
  2. 潜在输入残留问题:程序运行时,cin缓冲区可能残留换行符,导致第一次getline读取到空字符串,影响后续匹配。

修复步骤

  1. 修正字符串拼接逻辑
    把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) {
    
  2. 处理输入残留换行
    如果发现第一次getline读取空内容,在循环前添加代码清空缓冲区:

    #include <limits> // 需包含此头文件
    // 忽略缓冲区中所有字符直到换行符
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    
  3. 修复内存泄漏
    原代码中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:35:34