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;

}

我不明白几件事:

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

4

1 回答 1

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".

于 2012-07-18T11:07:18.910 回答