XORing “Hallo Welt!” schneidet Schnur ab

Lesezeit: 3 Minuten

Benutzer-Avatar
0x6B6F77616C74

#include <stdio.h>
#include <string.h>

int main()
{
    char greeting[]="\nHello World!\n";
    int a;

    for(int i=0; i<strlen(greeting); i++)
        greeting[i]^=111;

    for(int i=0; i<strlen(greeting); i++)
        greeting[i]^=111;

    printf("%s\n",greeting);    
    scanf("%d",&a);

}

Ausgabe:

Hell

Warum schneidet es alles ab, nachdem es einen Buchstaben entdeckt hat, der der Nummer der XOR-Taste entspricht (in diesem Fall ASCII ‘w’)? In der mathematischen Logik N^N=0 und 0^N=Nnicht wahr?

  • DEMO

    – qwertymk

    1. Mai 2012 um 0:35 Uhr

  • Das soll eine einfache XOR-Verschlüsselung sein, oder?

    – Linuxios

    1. Mai 2012 um 0:52 Uhr

  • Ist das ein Quiz oder ein echtes Problem, das Sie haben? Ich glaube nicht, dass diese Seite der Ort für Quizze ist.

    – ugoren

    1. Mai 2012 um 7:06 Uhr

  • Beachten Sie, dass Sie eine haben Der Algorithmus von Shlemiel dem Maler darin, was ein ziemlich starker Code-Geruch ist. Wenn Sie das beheben, wird auch der Kürzungsfehler behoben.

    – Daniel Priden

    1. Mai 2012 um 23:30 Uhr

  • @DanielPryden +1 für eine Beobachtung, die wichtiger ist als die Analyse der Ursache der XOR-induzierten vorzeitigen Beendigung. Ich habe es satt, Leute zu sehen, die For-Schleifen mit unnötigen Funktionsaufrufen in ihrer Beendigungsbedingung schreiben. Ich habe gesehen, dass Schleifen, die Mikrosekunden dauern sollten, aufgrund solcher Dinge mehrere Millisekunden dauern sollten.

    – Telefontagger

    4. Mai 2012 um 14:29 Uhr


Benutzer-Avatar
zick

Da 'o' ist ASCII-Code 111, und XORing 111 mit 111 ergibt 0, NUL, und beendet Ihre Zeichenfolge. Sobald dies passiert (sogar in der ersten Schleife, da Sie es jedes Mal durch die Schleife auswerten), strlen berichtet, dass die Saite viel kürzer ist und die Schleifen aufhören.

Das Speichern der Zeichenfolgenlänge vor dem Durchlaufen der XORs erspart Ihnen dies.

  • Beachten Sie, dass er zur Behebung dieses Problems den Rückgabewert von speichern sollte strlen bevor er die Saite mutiert.

    – Seth Carnegie

    1. Mai 2012 um 0:38 Uhr


  • @NicolBolas Er mutiert es und mutiert es dann und danach wird die ursprüngliche Zeichenfolge erhalten, also Beweis: ideone.com/omgw0

    – Seth Carnegie

    1. Mai 2012 um 0:42 Uhr

  • +1. Beachten Sie, dass das xoring auch die erste Schleife beeinflusst – es geht nicht nach dem ‘o’.

    – asaelr

    1. Mai 2012 um 0:42 Uhr

  • Eingebaute Kommentare. Vielen Dank! (Ich habe anfangs nicht an die erste Schleife gedacht.)

    – zick

    1. Mai 2012 um 0:50 Uhr

Benutzer-Avatar
Sergej Kalinitschenko

Denn wenn Sie eine Zahl mit sich selbst xoren, wird sie null, und wenn strlen null sieht, denkt es, es sei das Ende der Zeichenfolge.

Wenn Sie die Länge vor der ersten Schleife in einer Variablen speichern und diese gespeicherte Länge dann in Ihrer zweiten Schleife anstelle von strlen verwenden, erzeugt Ihr Programm das erwartete Ergebnis.

Benutzer-Avatar
Adarsch

greeting[5] ist ‘o’, was 111 in ASCII ist. Daher Gruß[5] ^ 111 wird Null sein (was Ihren String beendet) Der Strlen in der zweiten Schleife gibt einen anderen Wert zurück.

Um dies zu beheben, verwenden Sie eine Variable len, um den ursprünglichen Strlen zu speichern. Du bekommst deinen String zurück !!!

Geändert:

#include <stdio.h>
#include <string.h>

int main()
{
    char greeting[]="\nHello World!\n";
    int a;
    int len = strlen(greeting);

    for(int i=0; i<len; i++)
        greeting[i]^=111;

    for(int i=0; i<len; i++)
        greeting[i]^=111;

    printf("%s\n",greeting);    
    scanf("%d",&a);

}

1226460cookie-checkXORing “Hallo Welt!” schneidet Schnur ab

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy