C 此程序的可能输入是什么?

C 此程序的可能输入是什么?,c,C,我希望您能帮助我了解用户对以下程序的输入是什么,这些程序可以进行输出: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++])) ;

我希望您能帮助我了解用户对以下程序的输入是什么,这些程序可以进行输出:
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;

}
int main(无效){
int i=0;
char j[22]=“这是一个长字符串”,k[3];
扫描频率(“%2s”,k);
sprintf(j,k);
printf(“%s”,j);
对于(;i<21;printf(“%c”,j[i++]))
;
返回1;
}
有两件事我不明白:


k只能从用户那里获得两个字符-这就是
%2s”
的意思吗,否?然后将数组k指向的内容写入j指向的数组中,因此
j
不指向k,但是如果我们
j[5]
我们仍然会得到
i
。所以我不明白我们怎么能得到这个输入,因为输入会被切碎成两个字符
j[0],j[1]
将是来自输入的两个字符,
j[I]
的其余部分将是“这是一个长字符串”的原始剩余部分

我只是在猜测,但问题可能在于循环。不检查字符串终止符,而是打印所有数组,无论字符串是否已结束

如果将循环更改为:

for (; i < 22 && j[i] != '\0'; printf("%c", j[i++])) ;
for(;i<22&&j[i]!='\0';printf(“%c”,j[i++]);
您应该得到预期的输出


(注意:我还将
21
更改为
22
,这是数组的大小。您当然可以
I在调用
scanf
后输入程序的内容,即
k
是什么?还有,哪个输出错误?单机
printf
或循环打印单个字符,或者两者都有?@JoachimPileborg
帮助理解什么可以是输入
h/她想要反向工程。k是一个用于存储用户输入的变量,然后被复制到j。它没有任何特殊意义或用途。FWIW,我在VC2010或gcc 4.1.2中没有看到这种行为。
j
的前三个
char
s是changed(两个新的
char
s和终止NULL),其余的保持不变。我想他是在问为什么
j
的其余部分在
sprintf()之后被修改了
,它应该只更改
j
的前三个
char
s。我不能更改代码,代码已经给了我,我需要回答我问的问题。@hmjd你可能是对的。编辑我的答案以包含一个可能的问题。@分子你不必更改代码,我已经编辑了答案以包含一个问题您在问题中提供的代码。+1,编辑中的示例导致修改的字符超过前3个。