getline in C
原型
使用man getline
可以看到UNIX提供的库函数getline
的原型。
1 |
|
性质
getline()
从stream中读入一整行,- 如果
*lineptr
设置为NULL并且*n=0
,getline()
会分配一个buffer存储读入的line。这个buffer应该被用户程序释放,即使geline()
失败了。 - 如果
*lineptr
包含一个指针,大小是*n
字节。当buffer不能存下读入的line时,getline()
会使用realloc(3)
对buffer进行resize,更新*lineptr
和*n
。 - 只要成功调用,
*lineptr
和*n
分别表示的是buffer的地址和分配的内存大小。 getdelim()
和getline()
一样,只不过可以指定一个delimiter而不是使用newline作为delimiter。任何delimiter都会存进*lineptr
中。- 为什么
getline
需要的是char**
而不是char*
,因为getline
在lineptr指向的空间不足时,重新分配内存,如果使用的是char*
的话,当getline
重新分配内存后,我们就失去了对line
的访问,而使用一个char**
类型的字符串,使用一个char**
类型,即指针的指针记录每次分配的char*
。[3]。
getline in C++
cin.getline
cin.getline()
是操作C strings,即字符数组的。不会将'\n'
读入。
std::getline
std::getline()
是操作C++ strings的,即std::string
。std::getline()
从input stream中读一个string,遇到delimiter就停止,默认的delimiter是'\n'
。即使输入开始就是delimiter也会停止。std::getline()
会把delimiter也读进来,然后把读到的内容存到string
对象中去,存入的内容不包含delimiter。
代码示例
getline
1 |
|
getdelim
1 |
|
参考文献
1.https://stackoverflow.com/questions/4872361/why-are-there-two-different-getline-functions-if-indeed-there-are
2.https://www.reddit.com/r/learnprogramming/comments/4fx64h/is_there_a_difference_between_cingetline_and/
3.https://stackoverflow.com/questions/5744393/why-is-the-first-argument-of-getline-a-pointer-to-pointer-char-instead-of-c/36098042