我希望得到您的帮助,了解用户可以输入以下可以输出的程序: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;
}
我不明白几件事:
k只能从用户那里获得两个字符 - 这是"%2s"
的含义,不是吗?然后写入由数组k指向的内容j指向的数组,因此j
不指向k,但如果我们j[5]
,我们仍将获得i
。所以我不明白我们怎么能得到这个输入,因为输入被切成两个字符j[0], j[1]
将是来自输入的两个字符,其余的j[i]
将是原来的其余部分“这是一个很长的字符串”。
答案 0 :(得分:3)
我只是在这里猜测,但问题可能在于循环。您不检查字符串终止符,但打印所有数组,无论字符串是否已结束。
如果您将循环更改为:
for (; i < 22 && j[i] != '\0'; printf("%c", j[i++])) ;
你应该得到预期的输出。
(注意:我还将21
更改为22
,这是数组的大小。您当然可以i <= 21
,因为它是相同的。)
编辑:在hmjd发表评论后重新阅读问题。
如果scanf
读取的输入包含百分比('%'
)字符,之后对sprintf
的调用将尝试将其解析为格式代码。如果我使用输入%d123
测试此程序,则k
将按预期"%d"
生成,但生成的数组j
将为"192795408\0long string"
。