2012-07-18 56 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