2012-07-18 50 views
2

我想要了解什麼可以從用戶到以下程序的輸入,可以使輸出的幫助:U%ae'$ffq' ong string什麼可能是這個程序可能的輸入?

int main(void) { 
    int i=0; 
    char j[22]="This is a long string", k[3]; 

    scanf("%2s ", k); 
    sprintf(j, k); 
    printf("%s", j); 
    for (; i< 21; printf("%c", j[i++])) 
     ; 
    return 1; 

} 

我不明白幾件事情:

ķ可以從用戶只得到兩個字符 - 這是什麼"%2s"意味着,不是?然後寫入由j指向的數組k指向的內容,因此j未指向k,但如果我們將j[5]仍然得到i。所以我不明白我們怎麼能得到這個輸入,因爲輸入將被切成兩個字符j[0], j[1]將是來自輸入的兩個字符,其餘的j[i]將是「這是一個長串」的原始剩餘部分。

+0

你對程序的輸入是什麼,即在調用'scanf'後什麼是'k'? – 2012-07-18 11:00:28

+0

另外,哪個輸出是錯誤的?獨立的'printf'或循環打印單個字符,還是兩者兼而有之? – 2012-07-18 11:01:48

+0

@JoachimPileborg'幫助理解什麼可以是輸入'她/她想要逆向工程。 – 2012-07-18 11:02:32

回答

3

我只是在這裏猜測,但問題可能是循環。您不檢查字符串終止符,而是打印所有數組,無論字符串是否結束。

如果更改循環到這一點:

for (; i < 22 && j[i] != '\0'; printf("%c", j[i++])) ; 

你應該得到預期的輸出。

(注:我也改變2122這是數組的大小,當然你可以做i <= 21因爲這是一樣的。)

編輯:重讀的問題從hmjd評論後。

如果由scanf讀取的輸入包含百分比('%')字符,則之後調用sprintf將嘗試將其解析爲格式代碼。如果我使用輸入%d123測試此程序,則k將按預期方式爲"%d",但生成的陣列j將爲"192795408\0long string"

+0

我想他是問爲什麼在'sprintf()'之後修改'j'的剩餘部分,它應該只改變'j'的前三個'char's。 – hmjd 2012-07-18 11:12:24

+0

我不能更改代碼,代碼給我,我需要回答我問的問題。 – Numerator 2012-07-18 11:16:00

+0

@hmjd你可能是對的。編輯我的答案包括一個可能的問題。 – 2012-07-18 11:23:25