2014-06-13 88 views
1

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的最小長度。 –

回答

2

一個被整頓假定您只處理二進制數字字符串'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說你不必。

而問題是活躍這個答案開始。然後,生活就這樣陷入了困境。

3

您的代碼需要一些重構。

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