2017-01-02 1 views
0

Wenn ich versuche, ein bitweises XOR von zwei Strings zu machen, bekomme ich x∈K oder ähnliche Ausgabe. Der Code Ich verwende:Druckergebnis einer bitweisen XOR in C

char test[] = "teststring"; 
char test2[] = "testtwostring"; 
char *bytearray = NULL; 
bytearray = malloc(sizeof(char) * (strlen(test2)+1)); 

for(int j=0; (j< strlen(test) && j< strlen(test2)); j++){ 
    bytearray[j] += test[j]^test2[j]; 
} 

printf(bytearray) 

Sollte es nicht das XOR-Ergebnis sowohl Zeichenfolge speichern, die in jedem der bytearray Elemente, und dann eine neue Ergebniszeichenfolge ausdrucken? Gibt es etwas, das mir fehlt?

+3

Verwenden Sie nicht Ihre druckbaren Daten als 'printf()' Formatzeichenfolge. Verwenden Sie immer ein explizites Format. –

+0

Wie genau soll es ausgegeben werden? Als Hex? – samgak

Antwort

2

Sie haben bytearray nicht initialisiert, also enthält es, was auch immer Müll in diesem Abschnitt des Speichers war, als es zugewiesen wurde. Sie tun möchten:

memset(bytearray, 0, sizeof(char) * (strlen(test2) + 1)); 

, nachdem Sie das Array mit malloc() zuordnen. Wie @ John Bollinger erwähnt, können Sie die malloc und memset durch den Aufruf calloc kombinieren:

bytearray = calloc(strlen(test2) + 1, sizeof(char)); 

Als weitere Alternative könnten Sie einfach anstelle der Zugabe zuweisen:

bytearray[j] = test[j]^test2[j]; 

statt:

bytearray[j] += test[j]^test2[j]; 

Auch sollten Sie strlen nicht wiederholt aufrufen, da der Wert sich nie ändert. Sie sollten es nur einmal für test und test2 aufrufen, diese Werte in Variablen speichern und die Variablen verwenden. Gerade jetzt strlen wird unnötigerweise zweimal jedes Mal aufgerufen, wenn Ihre for Schleife iteriert.

+3

Oder verwenden Sie 'calloc()' anstelle von 'malloc()'. –

4

Es gibt viele Probleme in Ihrem Code:

  • bytearray[j] += test[j]^test2[j]; modifiziert bytearray, aber es ist nicht initialisiert, so sollte seine Werte nicht einmal überhaupt gelesen werden und was auch immer sie sind unberechenbar. Das erklärt deine Beobachtungen vollständig.

  • Sie nicht null die Zeichenfolge in bytearray zu beenden, so druckt es nicht definierte Verhalten, da es nicht initialisiert ist.

  • übergeben Sie printf das Byte-Array direkt. Wenn es zufällig ein Zeichen % enthält, würde das undefiniertes Verhalten aufrufen, da Sie keine zusätzlichen Argumente an printf übergeben. Sie sollten mindestens printf("%s\n", bytearray); schreiben

  • Die Werte in bytearray sind nicht unbedingt druckbare Zeichen.

  • Das Aufrufen von strlen(test) und strlen(test2) im Testausdruck ist sehr ineffizient, da diese Operation teuer ist und für jede Iteration der Schleife wiederholt wird.Verwenden Sie diesen Test statt:

    for (j = 0; test[j] != '\0' && test2[j] != '\0'; j++) { 
        ... 
    

Da Ihr Ziel zu speichern Sie das XOR-Ergebnis beiden Strings ist, sollten Sie den Code auf diese Weise ändern:

char test[] = "teststring"; 
char test2[] = "testtwostring"; 
size_t len = strlen(test); 
size_t len2 = strlen(test2); 
unsigned char *bytearray = malloc(len2 + 1); 
size_t j; 

for (j = 0; j < len && j < len2; j++) { 
    bytearray[j] = test[j]^test2[j]; 
} 
for (; j < len2; j++) { 
    bytearray[j] = test2[j]; 
} 

printf("XOR byte values: \n"); 
for (j = 0; j < len2; j++) { 
    printf("%02X ", bytearray[j]); 
} 
printf("\n"); 
+0

Und die Endung der for-Schleife ist '(j dawg

+0

@dawg: Es ist unklar, warum das OP das tut, aber da die Schleife an der kürzesten der beiden Strings stoppt, ist dies kein echtes Problem. 'Bytearray' könnte einfach zu lang sein. – chqrlie

+0

'strlen()' in praktisch allen modernen Compilern ist eine intrinsische Funktion. Wenn die Länge eines Strings zur Kompilierungszeit bestimmt werden kann, ist dies normalerweise der Fall (sofern Sie den entsprechenden Header enthalten). – dreamlax

Verwandte Themen