我刚刚发现不推荐使用gets,并且由于可靠性问题,不推荐使用scanf,因此我尝试使用getline()。
如果我声明一个size_t变量并为其分配要使用的字节数,我可以毫无问题地使用getline。
据我所知,如果我想让getline到memalloc,我必须将第二个参数(size_t * one)设置为零,将char **设置为NULL。它有效:
int main(){
int read;
size_t zero = 0;
char *A;
A=NULL;
printf("Write something:\n");
read=getline(&A, &zero, stdin);
if(read!= -1) puts(A);
return 0;
}
如果我为变量赋值为零,那么它可以工作,但为什么我不能声明变量并像这样抛出零(0):
int main(){
int read;
//size_t zero = 0;
char *A;
A=NULL;
printf("Write something:\n");
read=getline(&A, (size_t *)0, stdin);
if(read!= -1) puts(A);
return 0;
}
最后一个代码编译正常,但getline返回-1,所以出错。
答案 0 :(得分:1)
因为&size
不是空指针。它是包含 0
的对象的有效地址,它与指针0
不同并指向无处。
BTW,gets
已从C标准中删除,但fgets
未被删除。这是便携式C的方法。
答案 1 :(得分:0)
this is the correct way to use getline()
#include <stdio.h>
int main()
{
int bytes_read; // number of bytes actually read
int nbytes = 100; // max number of bytes to read
char *my_string; // ptr to byte read
puts ("Please enter a line of text.");
/* These 2 lines are the heart of the program. */
my_string = (char *) malloc (nbytes + 1);
if( NULL == my_string )
{ // then error occurred with malloc
perror( "malloc" );
exit(1);
}
// implied else
bytes_read = getline (&my_string, &nbytes, stdin);
if (bytes_read == -1)
{
puts ("ERROR!");
}
else
{
puts ("You typed:");
puts (my_string);
}
free( my_string );
return 0;
}
答案 2 :(得分:0)
您可以查看getline()
的{{3}}以更好地理解。
正如函数prototye所说
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
有两种情况。
如果*lineptr
为NULL
,那么getline()
本身将分配一个用于存储该行的缓冲区,该行需要由用户。在这种情况下,由于*lineptr
是NULL
,缓冲区的大小(由size_t *n
表示)没有意义,并且忽略了它。 getline()
处理内存分配。
如果在调用getline()
之前,*lineptr
包含指向malloc()
- 已分配缓冲区的指针,那么我们需要告诉其大小缓冲区为getline()
,即大小为*n
个字节。如果缓冲区不足以容纳该行,getline()
会使用realloc()
调整其大小,使用新值更新*lineptr
和*n
。
所以,根据你的问题
如果我声明一个size_t变量并为其分配要使用的字节数,我可以毫无问题地使用getline。
==&GT; Number of bytes to use
应该是已分配缓冲区的大小(如果已分配)。
据我所知,如果我想让getline到memalloc,我必须将第二个参数(size_t * one)设为零,将char **设为NULL。
==&GT; *lineptr
应为NULL,对。 *n
可以保留任何值,因为它会被忽略,但n
应该是一个虚拟指针[如size_t zero = 0;
和&zero
],而不是{{1}指针[如NULL
的情况],因为在成功调用(size_t *)0
后,getptr()
将更新以反映分配的大小。
希望这会有所帮助!!