该计划的可能输入是什么?

时间:2012-07-18 10:57:02

标签: 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++]))
        ;
    return 1;

}

我不明白几件事:

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

1 个答案:

答案 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"