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++]))
        ;
    return 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++])) ;

您应该得到预期的输出。

(注意:我还将 21 更改为 22,这是数组的大小。您当然可以这样做 i <= 21 因为这是相同的。)

编辑:在 hmjd 发表评论后重新阅读问题。

如果输入被 scanf 读取包含百分比 ( '%' ) 字符的调用 sprintf之后将尝试将其解析为格式化代码。如果我使用输入 %d123 测试该程序,然后k将是"%d"正如预期的那样,但结果数组 j将是"192795408\0long string" .

关于c - 该程序可能的输入是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11539763/

相关文章:

c - 当我为 & records[*Count].source 输入值时,.exe 崩溃

c - Malloc 加一以初始化字符串连接 C 的字符

c - 最新的系统日志消息被延迟

c - 静态结构的元素

c - 使用结构体的成员作为验证

C:多维数组实现不起作用,给出不同的值

c - 预处理器指令 #error 和 #warning 之间的区别

在 Windows 中使用 Eclipse 编译 ARM

c - 如何使用 Perl/其他东西搜索和替换 C 源代码中的特定代码行?

c++ - 暂时将指针设为 NULL 有什么意义吗?