我的程序应该通过 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
我不明白的事情:
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] 删除。
我来说两句