获取C XOR返回值
在for
循环中,它在每个循环中打印正确的值11100001
,但主呼叫print char_str
为空。获取C XOR返回值
我希望它可以返回11100001
作为char
。
//xor
char * xorencrypt(char * a, char * b) {
size_t alen = strlen(a);
size_t blen = strlen(b);
char * encrypted = malloc(alen + 1);
int i;
for (i = 0; i < 8; i++) {
encrypted[i] = a[i]^b[i];
printf("%s\n", encrypted[i]);
}
encrypted[alen] = '\0';
return encrypted;
}
main {
char * char_str = xorencrypt("11011000", "00111001");
printf("%s\n", char_str);
}
一个被整顿假定您只处理二进制数字字符串'0'
和'1'
的代码版本。如果你正在处理更一般的字符串,你将需要一个不同的解决方案。
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
static
char *xorencrypt(char *a, char *b)
{
size_t alen = strlen(a);
char *encrypted = malloc(alen + 1);
assert(alen == strlen(b));
assert(encrypted != NULL);
for (size_t i = 0; i < alen; i++)
{
assert(a[i] == '0' || a[i] == '1');
assert(b[i] == '0' || b[i] == '1');
encrypted[i] = (a[i]^b[i]) + '0';
putchar(encrypted[i]);
}
encrypted[alen] = '\0';
putchar('\n');
return encrypted;
}
int main(void)
{
char *char_str = xorencrypt("11011000", "00111001");
printf("%s\n", char_str);
free(char_str);
return 0;
}
当中的变化:
- 错误检查内存分配。使用
assert()
是在生产代码中执行此操作的不好方法,但它确实可以确保检查内存是否已分配。 - 检查字符串长度是否相同。
- 删除未使用的变量
blen
。 -
static
是可选的;它意味着代码在我使用的严格选项(它需要在定义或使用之前对每个非静态函数进行原型声明)进行干净地编译。 - 循环索引
i
与size_t
是类型相同,以避免有关比较有符号值和无符号值的警告。我正在使用C99风格“在for
循环中声明变量”符号。 - 循环的上限取决于字符串的测量长度,而不是固定常数。
- XOR操作的原始版本为每个字符生成了空值
'\0'
或控件-A'\1'
。 - 关键XOR操作的修订版本确保结果是可打印的数字。
- 原来的
printf("%s\n", encrypted[i]);
传递一个字符作为字符串打印。如果你的编译器没有警告你,打开警告选项或者得到一个更好的编译器。 - 如果你写的是
printf("%s\n", &encrypted[i]);
你可能会遇到问题,可能会有一个字符串不能保证在循环中被空终止(尽管你在循环后没有终止字符串,这很好)。 -
main()
中的代码释放分配的内存。确保每个malloc()
有free()
是一个好习惯。 - 我宁愿明确地从
main()
返回0,即使C99说你不必。
而问题是活跃这个答案开始。然后,生活就这样陷入了困境。
您的代码需要一些重构。
1)您需要包括一些头
#include <stdint.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
2) '主' 函数返回一个int
int main() {
/* code here */
return 0;
}
3)您应确保在调用malloc的成功
char * encrypted = malloc(alen + 1);
assert(encrypted != (char*)0); /* requires #include <assert.h>
4)你应该小心,当xor'ing和零。你与那些(ASCII码值49)处理字符像整数
你是异或零(ASCII码值48)
encrypted[i] = a[i]^b[i];
你想是这样的,而不是
int a_i = a[i] - '0';
int b_i = b[i] - '0';
encrypted[i] = (a_i^b_i) + '0';
你可以清楚地写出'encrypted [i] =(a [i]^b [i])+'0';'。正如所写的,它是有效的,但评估实际上是'a_i ^(b_i +'0')',这可能不是你所想的。对逻辑运算符和算术运算符进行混合时,要非常小心。 –
是的,修正了这个问题。 – JC1
您的代码无法编译。 – haccks
你想异或''0'^'1''的char值或翻转''1'和'0'吗? – MatthiasB
不使用变量'blen“。删除它或使用它来查找两个C-Strings的最小长度。 –