C-检查str是否为null
在我的代码C中,我有**行,我需要检查*行是否为空,我编写了以下代码,可以使程序崩溃,我不知道为什么C-检查str是否为null,c,C,在我的代码C中,我有**行,我需要检查*行是否为空,我编写了以下代码,可以使程序崩溃,我不知道为什么 如何检查*行是否为空 (我有0个警告,0个错误:-Wall-Werror-Wextra) 源代码: #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include "libft/libft.h" # define BUFF_SIZE 16 int read_buffer(int
如何检查*行是否为空
(我有0个警告,0个错误:-Wall-Werror-Wextra)
源代码:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include "libft/libft.h"
# define BUFF_SIZE 16
int read_buffer(int const fd, int ret, char **endl, char **buffer)
{
char buff[BUFF_SIZE + 1];
ret = read(fd, buff, BUFF_SIZE);
buff[ret] = '\0';
if (ret > 0)
{
*buffer = ft_strjoin(*buffer, buff);
*endl = ft_strchr(*buffer, '\n');
}
return (ret);
}
int get_next_line(int const fd, char **line)
{
static char *buffer;
char *endl;
int ret;
if (!buffer && !(buffer = ft_memalloc(BUFF_SIZE + 1)))
return (-1);
if (!*line) // HERE, program crash
*line = my_strdup("");
ret = 1;
endl = ft_strchr(buffer, '\n');
while (ret > 0)
{
ret = read_buffer(fd, ret, &endl, &buffer);
if (endl)
{
buffer[endl - buffer] = '\0';
*line = my_strdup(buffer);
buffer = my_strdup(endl + 1);
return (1);
}
if (ret == 0)
{
if (ft_strcmp("", *line) == 0)
{
*line = my_strdup(buffer);
return (1);
}
return (0);
}
}
return (ret);
}
int main(void)
{
int fd;
int ret;
char *line;
if ((fd = open("b.txt", O_RDONLY)) < 3 && fd != 0)
return (-1);
printf("%d\n", fd);
ret = get_next_line(fd, &line);
printf("%d - %s\n", ret, line);
ret = get_next_line(fd, &line);
printf("%d - %s\n", ret, line);
ret = get_next_line(fd, &line);
printf("%d - %s\n", ret, line);
ret = get_next_line(fd, &line);
printf("%d - %s\n", ret, line);
return (0);
}
#包括
#包括
#包括
#包括“libft/libft.h”
#定义BUFF_大小16
int read_缓冲区(int const fd,int ret,char**endl,char**buffer)
{
字符缓冲[缓冲大小+1];
ret=读取(fd、buff、buff\U大小);
buff[ret]='\0';
如果(ret>0)
{
*缓冲区=ft_strjoin(*缓冲区,浅黄色);
*endl=ft_strchr(*缓冲区,'\n');
}
返回(ret);
}
int get_下一行(int const fd,字符**行)
{
静态字符*缓冲区;
char*endl;
int ret;
如果(!buffer&&!(buffer=ft_memalloc(BUFF_SIZE+1)))
返回(-1);
if(!*line)//此处,程序崩溃
*行=我的标准(“”);
ret=1;
endl=ft_strchr(缓冲区“\n”);
而(ret>0)
{
ret=读取缓冲区(fd、ret、endl和缓冲区);
如果(endl)
{
缓冲区[endl-buffer]='\0';
*line=我的备份(缓冲区);
buffer=my_strdup(endl+1);
申报表(1);
}
如果(ret==0)
{
如果(ft_strcmp(“,*行)==0)
{
*line=我的备份(缓冲区);
申报表(1);
}
返回(0);
}
}
返回(ret);
}
内部主(空)
{
int-fd;
int ret;
字符*行;
如果((fd=open(“b.txt”,Ordonly))<3&&fd!=0)
返回(-1);
printf(“%d\n”,fd);
ret=获取下一行(fd和行);
printf(“%d-%s\n”,ret,行);
ret=获取下一行(fd和行);
printf(“%d-%s\n”,ret,行);
ret=获取下一行(fd和行);
printf(“%d-%s\n”,ret,行);
ret=获取下一行(fd和行);
printf(“%d-%s\n”,ret,行);
返回(0);
}
您正在测试*line
中的获取下一行()
是否正确为空。问题是您从未在main()
中将line
初始化为NULL
。因为它是未初始化的,所以在尝试使用它时会出现未定义的行为
改变
char *line;
到
如果(行&&!(*行))呢。。非常感谢,它起作用了!
char *line = NULL;