gpt4 book ai didi

c - read() 函数中限制缓冲区

转载 作者:行者123 更新时间:2023-11-30 16:39:47 26 4
gpt4 key购买 nike

我必须创建一个程序,从标准输入请求一个字符串,并在标准错误中写入先前写入的字符串。这是我的程序:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main() {
char *buffer = malloc(sizeof(char)*20);
int len = 0;

do {
len = read(STDIN_FILENO, buffer, 20);
if(len == -1)
write(STDERR_FILENO, "Error read\n", 10);
else
write(STDERR_FILENO, buffer, len);
} while(strncmp(buffer,"fine\n", 5));

free(buffer);
return 0;
}

代码可以工作,但我不满意..有一个问题:缓冲区是 20 个字符,但我可以插入超过 20 个字符...为什么?如何将缓冲区限制为仅 20 个字符?

最佳答案

The code works but I'm not satisfied..there is one problem: The buffer is a 20char but I can insert more than 20 char...why?

因为你的程序无法阻止有人输入超过20个字符;它所能做的就是限制它不会溢出它已经溢出的缓冲区 - read()读取的内容不会超过请求的字节。它只是看起来好像read()调用读取的内容超过了大小(20),但实际上read()只读取了(最多)20个字符,其余的被读入下一个迭代。

无论您使用什么方法读取输入和/或增加缓冲区大小,“额外输入”的问题总是存在。您可以做的是检查 len 是否为 20 buffer[19] 是否不是 \n:

   else {
write(STDERR_FILENO, buffer, len);
/* Read out the left over chars. */
if (len == 20 && buffer[19] != '\n') {
char c;
do {
read(STDIN_FILENO, &c, 1); /* left out the error checking */
} while (c != '\n');
}

或者增加缓冲区大小,例如增加到 512 字节,然后只查看您感兴趣的前 20 个字节。

注意:为所有 read()write() 调用添加错误检查。

关于c - read() 函数中限制缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46927848/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com