2017-02-14 3 views
-2

Ich bin neu in der Programmierung, es tut mir leid, wenn meine Frage schwer zu verstehen ist.Wie Strings zu vergleichen, die Anzahl der Unterschiede zeigt

Ich habe einen String modelAnswer als solche

string modelAnswer = "ABABACDA"; 

Also es sollte die Antworten auf Quizfragen sein, und ich versuche, es zu machen, so dass die Eingabe, wenn Benutzers ist string studentAnswer = "ABADBDBB"; zum Beispiel wird das Programm zeigen dass ich 3 Punkte bekommen habe, da die ersten drei Buchstaben der studentAnswer-Zeichenfolge mit der modelAnswer übereinstimmen.

+0

Iterierte durch den Strang und jedes Element vergleichen. – NathanOliver

+0

Sie könnten die zwei Zeichenfolgen char durch char vergleichen. –

+0

Sie können [std :: mismatch] (http://en.cppreference.com/w/cpp/algorithm/mismatch) in einer Schleife verwenden, bis die Enditeratoren zurückgegeben werden, um die Menge der Unterschiede zu finden. –

Antwort

0

Mit einem stringstream können Sie ein Zeichen nach dem anderen in temporäre Variablen schieben und auf Äquivalenz in einer Schleife testen.

#include <iostream> 
#include <string> 
#include <sstream> 

int main() { 
    std::istringstream model("ABABACDA"); 
    std::istringstream student("ABADBDBB"); 
    int diff = 0; 
    char m, s; 

    while ((model >> m) && (student >> s)) 
     if (m != s) diff++; 

    std::cout << diff << std::endl; // 5 

    return 0; 
} 
+0

Was passiert, wenn der Schüler nicht genügend Antworten gibt? Sie zählen diese Leerzeichen nicht. – NathanOliver

+2

Es ist mir nicht klar, warum die Verwendung von 'stringstream' hier von Vorteil ist. –

2

Sie Standard-Algorithmus std::inner_product wie zum Beispiel verwenden können

#include <iostream> 
#include <string> 
#include <numeric> 
#include <functional> 

int main() 
{ 
    std::string modelAnswer("ABABACDA"); 
    std::string studentAnswer("ABADBDBB"); 

    auto n = std::inner_product(modelAnswer.begin(), modelAnswer.end(), 
           studentAnswer.begin(), size_t(0), 
           std::plus<size_t>(), std::equal_to<char>()); 

    std::cout << n << std::endl; 


    return 0; 
} 

Die Programmausgabe ist

3 

Es wird angenommen, dass die Saiten die gleiche Länge haben. Andernfalls sollten Sie die Zeichenfolge low als erstes Argumentpaar verwenden.

Zum Beispiel

#include <iostream> 
#include <string> 
#include <numeric> 
#include <algorithm> 
#include <functional> 
#include <iterator> 

int main() 
{ 
    std::string modelAnswer("ABABACDA"); 
    std::string studentAnswer("ABADBDBB"); 

    auto n = std::inner_product(modelAnswer.begin(), 
           std::next(modelAnswer.begin(), std::min(modelAnswer.size(), studentAnswer.size())), 
           studentAnswer.begin(), size_t(0), 
           std::plus<size_t>(), std::equal_to<char>()); 

    std::cout << n << std::endl; 


    return 0; 
} 
+0

Wow, große Einsicht (abgesehen von der Verwendung von 'std :: endl' ). Ich dachte über 'count_if' und ein Lambda nach, aber das ist viel besser. –

+0

@PeteBecker Häufig verwendete Alternativen für die Familie der Count-Algorithmen sind std :: accumulate und std :: inner_product. :) –

1

Wenn Sie Standard-Strings verwenden, mit der richtigen (Hauptsächlich #include <string>) enthält, können Sie eine einfache schreiben für Schleife über jedes Zeichen zu durchlaufen, sie zu vergleichen.

std::string answer = "ABABACDA"; 
std::string stringToCompare = "ABADBDBB"; 
int score = 0; 
for (unsigned int i = 0; (i < answer.size()) && (i < stringToCompare.size()); ++i) 
{ 
    if (answer[i] == stringToCompare[i]) 
    { 
    ++score; 
    } 
} 
printf("Compare string gets a score of %d.\n", score); 

Der obige Code funktioniert für mich, Drucken das folgende Ergebnis:

Compare string gets a score of 3. 
+0

Sie haben Recht, ich habe meine Antwort aktualisiert. Vielen Dank! – Trevor

Verwandte Themen