获取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); 
} 
+1

您的代码无法编译。 – haccks

+0

你想异或''0'^'1''的char值或翻转''1'和'0'吗? – MatthiasB

+0

不使用变量'blen“。删除它或使用它来查找两个C-Strings的最小长度。 –

一个被整顿假定您只处理二进制数字字符串'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; 
} 

当中的变化:

  1. 错误检查内存分配。使用assert()是在生产代码中执行此操作的不好方法,但它确实可以确保检查内存是否已分配。
  2. 检查字符串长度是否相同。
  3. 删除未使用的变量blen
  4. static是可选的;它意味着代码在我使用的严格选项(它需要在定义或使用之前对每个非静态函数进行原型声明)进行干净地编译。
  5. 循环索引isize_t是类型相同,以避免有关比较有符号值和无符号值的警告。我正在使用C99风格“在for循环中声明变量”符号。
  6. 循环的上限取决于字符串的测量长度,而不是固定常数。
  7. XOR操作的原始版本为每个字符生成了空值'\0'或控件-A '\1'
  8. 关键XOR操作的修订版本确保结果是可打印的数字。
  9. 原来的printf("%s\n", encrypted[i]);传递一个字符作为字符串打印。如果你的编译器没有警告你,打开警告选项或者得到一个更好的编译器。
  10. 如果你写的是printf("%s\n", &encrypted[i]);你可能会遇到问题,可能会有一个字符串不能保证在循环中被空终止(尽管你在循环后没有终止字符串,这很好)。
  11. main()中的代码释放分配的内存。确保每个malloc()free()是一个好习惯。
  12. 我宁愿明确地从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'; 
+0

你可以清楚地写出'encrypted [i] =(a [i]^b [i])+'0';'。正如所写的,它是有效的,但评估实际上是'a_i ^(b_i +'0')',这可能不是你所想的。对逻辑运算符和算术运算符进行混合时,要非常小心。 –

+0

是的,修正了这个问题。 – JC1