如何通过标准输入阻止输入溢出

杰克杰克逊

我的程序应该通过 stdin 接受输入并将字符串存储到 size 的数组中SIZE

当我输入 7 个或更多值时出现问题;当程序在循环中运行时,仍然使用超出缓冲区大小的值,不断填充buf标准输入中剩余的内容(至少,我认为它是这样工作的)。

#define SIZE 8

char *readLine(char *buf, size_t size) {
    printf("$ ");
    fgets(buf, size, stdin);
    return buf;
}

int main() {
    char *buf = malloc(SIZE * sizeof(char));
    
    for (;;) {
        readLine(buf, SIZE);
        printf("> %s", buf);
    }   
}

我的输出分别测试了 6、7 和 8 的输入大小:

$ abcdef
> abcdef
$ abcdefg
> abcdefg$ > 
$ abcdefgh
> abcdefg$ > h

我不明白的事情:

  • 为什么第 7 个值使程序的输出看起来很奇怪?我认为第 7 个字符加上空字符会正常工作吗?
  • 为什么buf填充超过SIZE(在这种情况下8)的大小的值

由此,我是否可以进行简单的更改/添加来实现我想要的目标?

聚丙烯

为什么第 7 个值使程序的输出看起来很奇怪?我认为第 7 个字符加上空字符会正常工作吗?

fgets不读取过多的输入(超出您提供的缓冲区大小,不包括空字节的一字节空间)。因此该字符h留在输入流中,然后被您下一次调用fgets- 那读h和换行符所消耗\n读取换行符后,fgets终止读取进一步的输入。

为什么 buf 填充了超出 SIZE 大小的值(在本例中为 8)?

它没有。如前所述,剩余的输入被读取,因此它给出了这样的外观。

由此,我是否可以进行简单的更改/添加来实现我想要的目标?

您可以检查读取的缓冲区fgets是否有换行符;如果没有,则从输入流中读取并忽略剩余的字节。

你可以做:

void discard(const char *buf)
{
    if(strchr(buf, '\n') == NULL) {
        /* No newline found, so read & discard everything.
        while(getchar() != '\n');
    }
}

char *readLine(char *buf, size_t size) {
    printf("$ ");
    if (fgets(buf, size, stdin) != NULL) {
        discard(buf);
    }
    return buf;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章