当我尝试对两个字符串进行按位XOR时,我得到x��K或类似的输出。我正在使用的代码:
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)
如果不在每个bytearray元素中保存两个字符串的XOR结果,然后打印出新的结果字符串?有什么我想念的吗?
答案 0 :(得分:4)
您的代码中存在许多问题:
bytearray[j] += test[j] ^ test2[j];
修改bytearray
,但它未初始化,因此根本不应读取其值,无论它们是什么都是不可预测的。这完全解释了您的观察结果。
你没有null终止bytearray
中的字符串,因此打印它会调用未定义的行为,因为它未初始化。
直接传递printf
字节数组。如果巧合,它包含一个%
字符,那将调用未定义的行为,因为您没有将任何额外的参数传递给printf
。你至少应该写printf("%s\n", bytearray);
bytearray
中的值不一定是可打印的字符。
在测试表达式中调用strlen(test)
和strlen(test2)
的效率非常低,因为此操作很昂贵,并且在循环的每次迭代中都会重复执行。请改用此测试:
for (j = 0; test[j] != '\0' && test2[j] != '\0'; j++) {
...
由于你的目标是保存两个字符串的XOR结果,你应该这样修改代码:
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");
答案 1 :(得分:2)
您尚未初始化bytearray
,因此它包含分配时在该内存部分中发生的任何垃圾。你想做的事:
memset(bytearray, 0, sizeof(char) * (strlen(test2) + 1));
使用malloc()
分配数组后。正如@John Bollinger所说,您可以通过调用malloc
来合并memset
和calloc
:
bytearray = calloc(strlen(test2) + 1, sizeof(char));
作为另一种选择,您可以分配而不是添加:
bytearray[j] = test[j] ^ test2[j];
而不是:
bytearray[j] += test[j] ^ test2[j];
此外,您不应该反复调用strlen
,因为该值永远不会改变。您应该为test
和test2
分别调用一次,将这些值存储在变量中,然后使用变量。现在strlen
每次for
循环迭代时都会被不必要地调用两次。