Frage

Ich habe eine einfache Funktion, die prüft, ob die Übereinstimmung gegeben Strings eine bestimmte Bedingung, dann eine dritte Zeichenfolge erzeugen, basierend auf den 2 Einsen als Argumente erhalten. Die dritte Saite ist gut, aber wenn ich es zurück es plötzlich verwandelt sich in „\n“.

string sReturn = "";
if (sText.size() != sPassword.size()) {
     //Checks to see if the texts match a condition
     return sReturn;
}
for (int foo = 0; foo < sText.size(); foo++) {
    sReturn = "";
    sReturn += (char)sText[foo] ^ (char)sPassword[foo];
}
return sReturn;

In der für sReturn in Ordnung ist und die richtigen Inhalte, aber sobald es die Schleife vorhanden ist, plötzlich der Debugger sagt mir seinen Inhalt „\n“. Was mache ich falsch?

War es hilfreich?

Lösung

  1. Sie haben keine Zeichenfolge zu initialisieren mit leeren Zeichen-Array wie:

    std::string sReturn = "";
    

    Standardkonstruktors gemeint, es zu tun für Sie und ist viel effizienter. Korrekter Code:

    std::string sReturn;
    
  2. Zuweisen einen leeren String sReturn Bei jeder Iteration in der Schleife ist falsch. Nicht zu erwähnen, dass zu Löschen einer Zeichenfolge, die Sie zu Anruf haben std :: string :: clear () :

    sReturn = "";
    

    Korrekter Code:

    sReturn.clear (); 
    

    Dies soll aber von dem entfernt werden Schleife überhaupt in Ihrem Fall.

  3. Sie haben nicht explizit brauchen konvertiert das Ergebnis des Operators [] (Size_t) in einen Charakter, weil es ist ein Zeichen:

    sReturn += (char)sText[foo] ^ (char)sPassword[foo];
    

    Korrekter Code:

    sReturn += sText[foo] ^ sPassword[foo];
    
  4. Mit Nachinkrement in für Schleife ist nicht erforderlich. Es macht ein zusätzliche Kopie des „foo“ auf jedem Schritt:

    for (int foo = 0; foo < sText.size(); foo++)
    

    Dies wird wahrscheinlich optimiert werden, indem Compiler, aber Sie müssen loswerden diese schlechte Angewohnheit. Verwenden pre-Zuwachs statt. Richtig Code:

    for (int foo = 0; foo < sText.size(); ++foo)
    
  5. Der Aufruf std :: string :: size () auf jede Iteration, wenn Stringgröße nicht ändert nicht effizient ist:

    for (size_t foo = 0; foo < sText.size(); ++foo)
    

    Besserer Code:

    for (size_t foo = 0, end_foo = sText.size(); foo < end_foo; ++foo)
    

    Hinweis size_t Typ. Sie können nicht speichern Stringgröße in 32-Bit-Ganzzahl mit Vorzeichen da es nicht genug Kapazität Speichern großer Zahl. Die richtige Art ist size_t, die durch zurückgeführt wird std :: string :: size () Methode.

Unter Berücksichtigung aller oben, die korrekte Funktion wie folgt aussehen sollte:

std::string
getMixedString (const std::string & text, const std::string & password)
{
    std::string result;
    if (text.length () != password.length ())
        return result;
    for (size_t pos = 0, npos = text.length (); pos < npos; ++pos)
        result += text[pos] ^ password[pos];
    return result;
}

Aber es gibt ein Problem, wenn Sie die letzte Zeichenfolge zu sein für Menschen lesbaren wollen. Mit eXclusive OR (XOR) Operator auf zwei ASCII Zeichen könnten oder könnten Sie nicht für Menschen lesbaren Zeichen geben oder sogar eine ASCII Charakter. So können Sie am Ende resultierende Zeichenfolge, die die Zeilenumbrüche, nicht lesbare Zeichen, einige Müll zu löschen.

Um dies zu lösen, müssen Sie mit etwas besseren Algorithmus zu entwickeln, um eine String Stationierung auf zwei anderen Saiten zu erzeugen. Zum Beispiel können Sie verwenden, MD5-Hash beiden Strings oder kodieren sie in base64 .

Viel Glück!

Andere Tipps

Warum wollen Sie sReturn = "" haben innen die Schleife. Sollte das nicht vor der Schleife initialisiert werden?

Im gegebenen Fall sReturn wird immer nur einen Charakter hat. In Ihrem Fall würde ich nehme an die ^ Operation, was zu einem \ n Zeichen in der letzten Iteration.

Du hast bereits hatte das Problem erläutert. Ich werde eine ganz andere Art des vorschlagen, Dinge zu tun, dass ich denke, die meisten eliminiert Möglichkeit einen ähnlichen Fehler zu produzieren. Zuerst würde ich die „überprüfen, ob die Texte eine Bedingung übereinstimmen“ trennen Teil von der „codieren“ -Teil. Gerade jetzt, Sie haben einen (ziemlich klein) Code, der zwei zu haben scheint, meist in keinem Zusammenhang, Verantwortlichkeiten.

Der kodieren Teil, ich so etwas schreiben würde:

struct encode_byte { 
    char operator()(char a, char b) { 
        return a ^ b;
    }
};

std::transform(sText.begin(), sText.end(),
               sPassword.begin(), sPassword.end(),
               std::back_inserter(sResult),
               encode_byte());
string sReturn;
if (sText.size() != sPassword.size()) {
        return sReturn;
}
for (size_t foo = 0, end_foo = sText.size(); foo < end_foo; ++foo) {
        sReturn += sText[foo] ^ sPassword[foo];
}
return sReturn;

Ich habe es jetzt neu geschrieben alle Tipps. Ich entschuldige mich für den Fehler durch den Mangel an Aufmerksamkeit verursacht - die Zeichenfolge jedes Mal Clearing ich durch die Schleife laufen. Ich hoffe, es ist OK jetzt, bitte sagen Sie mir, ob es etwas ist, das mit ihm nicht stimmt. Vielen Dank an alle für ihre schnellen Antworten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top