我如何使用read()从stdin中读取?

问题描述 投票:-2回答:1

我的目标是创建一个my_readline函数,该函数将通过read()从stdin中读取输入,并进行打印。但是,它什么也没打印出来。

#include<stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#define READLINE_READ_SIZE 5


char *my_readline(int fd)
{
char *buffer=malloc(READLINE_READ_SIZE+1);
int i=0;
int size;
for(;(size=read(fd,buffer,READLINE_READ_SIZE))>0;i++)
{
    if(i<=READLINE_READ_SIZE||buffer[i]=='\n')
    break;
}
buffer[i]='\0';
return buffer;
}


int main(int argc, char**argv)
{
    char *arr=malloc(READLINE_READ_SIZE+1);
    arr=my_readline(0);
    printf("%s",arr);
    free(arr);
    return 0;
}

...

./a.out Hello
c stdin
1个回答
0
投票

上面的代码中存在导致输出丢失的问题

  1. 使用malloc保留了两个缓冲区,一个在主函数中,一个在my_readline函数中。指向第一个缓冲区的指针被指向第二个缓冲区的指针覆盖,从而导致内存泄漏。
  2. 仅第二个缓冲区中充满了内容,第一个缓冲区保持原始状态。
  3. i函数中的变量my_readline保留值0,直到函数结束。因此,缓冲区在导致空字符串的第一个字符处终止。
  4. read函数的返回值已分配给变量size,但此后未使用size
  5. 读取函数在for循环中被调用,这是不必要的,并可能导致无限循环。

这里是正确的代码:

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

#define READLINE_READ_SIZE 5

int my_readline(int fd, char *buffer, int maxsize)
{
    int size;

    size=read(fd,buffer,maxsize);
    if(size < 0){
        perror("Read error");
        size = 0;
    }

    buffer[size]='\0';
    return errno;
}

int main(int argc, char**argv)
{
    char *arr = (char *)malloc(READLINE_READ_SIZE+1);
    if (NULL == arr){
        printf("Coule not obtain mem\n");
        exit(-1);
    }
    int err = my_readline(0, arr, READLINE_READ_SIZE);
    if (!err){
        printf("\n%s\n",arr);
    }else{
        printf("Could not print out due to error!\n");
    }
    free(arr);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.