2017-10-12 64 views
-1

我正在練習從網上課程時,我偶然發現了THOS的內容,我剝幾乎所有的代碼,但是這仍然發生,我的代碼將如下printf的是打印2個變量

static const char alphabet1[] = "abcd"; 
void mycrack(char* hashed) 
{ 
    char pass[4]; 
    char salt[2]; 
    for (int a = 0, size = sizeof(alphabet1); a < size - 1; ++a) { 
     for (int b = 0, size = sizeof(alphabet1); b < size - 1; ++b) { 
      for (int c = 0, size = sizeof(alphabet1); c < size - 1; ++c) { 
       for (int d = 0, size = sizeof(alphabet1); d < size - 1; ++d) { 

        pass[a] = alphabet1[a]; 
        pass[b] = alphabet1[b]; 
        pass[c] = alphabet1[c]; 
        pass[d] = alphabet1[d]; 
        salt[0] = '5'; 
        salt[1] = '0'; 



        printf("salt:%s  \n",salt); 


       } 
      } 
     } 
    } 
} 
int main(int argc, string argv[1]) 
{ 
    mycrack(argv[1]); 

    return 0; 
} 

,但其中的printf應該打印每個itteration我得到鹽+通鹽(50):前

salt:50a  
salt:50ab  
salt:50abc  
salt:50abcd  
salt:50abcd  
salt:50abcd  
salt:50abcd  
salt:50abcd  
salt:50abcd  
salt:50abcd  
salt:50abcd 

請你注意,我知道我不應該被重新聲明內的靜態值循環,但我修改了代碼,原始代碼依賴於argv輸入和爲此將更難以舉例說明。

+6

你似乎忘了'用C char'字符串真的叫***空值終止**字節串*。無效終結者對於不要忘記是重要的。並注意null終止符是字符''\ 0',不是空指針(像'NULL')。當然,這意味着一個由兩個字符組成的字符串需要空間來容納*三個字符,以適合終止符。 –

+0

@Someprogrammerdude,感謝您的幫助,我習慣了更高級的語言,完全忘記了解決這個問題。 –

+0

'size = sizeof(alphabet1);一個是無意義的代碼膨脹,用'a Lundin

回答

0

問題通過@Someprogrammerdude在評論中說:

「你似乎忘了用C是字符字符串真的叫空值終止字節字符串的空終止符重要的是不要忘記,並注意。 null-terminator是字符'\ 0',不是空指針(就像NULL一樣)。當然,這意味着兩個字符的字符串需要三個字符的空間,以適合終結符。

解決方案的

char pass[5] = ""; 
char salt[3] = ""; 

代替

char pass[4]; 
char salt[2]; 
+0

你爲什麼初始化'char'數組的最後一個元素? – ryyker

+0

我這樣做是爲了設置字符串的結尾。 – 2017-10-12 13:00:43

+0

我明白了,但是你的意圖不應該是初始化第零個元素嗎?或者,更好的是,在其聲明語句中初始化該變量。 _ [看看這個](https://stackoverflow.com/a/26104331/645128)_ – ryyker