我的目标是创建一个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
上面的代码中存在导致输出丢失的问题
i
函数中的变量my_readline
保留值0,直到函数结束。因此,缓冲区在导致空字符串的第一个字符处终止。read
函数的返回值已分配给变量size
,但此后未使用size
。 这里是正确的代码:
#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;
}