getline函数编辑
getline()函数会生成一个包含一串从输入流读入的字符的字符串,直到以下情况发生会导致生成的此字符串结束。1)到文件结束,2)遇到函数的定界符,3)输入达到最大限度。
在函数遇到和结束定界符相等的字符时函数结束,同时函数抽出定界符,此种情况下该定界符既不被放回输入流,也不被放入要生成的字符串。所以由此可以理解输入结束后的第一个回车是定界符,被确认后抛弃,而第二个才是程序执行运行时正常需要的!
1函数介绍
C++有getline()函数(cin.getline()).
C有fgets(), gets()函数,也有getline.
cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数
主要功能是用于读取一行字符直到换行符,包括换行符.
2使用条件
linux标准C中使用条件:
#define _GNU_SOURCE
#include <stdio.h>
函数申明:
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
3返回值
成功:返回读取的字节数。
失败:返回-1。
参数:
lineptr:指向存放该行字符的指针,如果是NULL,则有系统帮助malloc,请在使用完成后free释放。
n:如果是由系统malloc的指针,请填0。
stream:文件描述符。
4应用举例
5与get函数的区别
6其它输入输出流函数对比介绍
1、cin
2、cin.get()
3、cin.getline()
4、getline()
5、gets()
6、getchar()
附:cin.ignore();cin.get()//跳过一个字符,例如不想要的回车,空格等字符
1、cin>>
用法1:最基本,也是最常用的用法,输入一个数字:
输入:2[回车]3[回车]
输出:5
注意:>> 是会过滤掉不可见字符(如 空格 回车,TAB 等)
cin>>noskipws>>input[j];//不想略过空白字符,那就使用 noskipws 流控制
用法2:接受一个字符串,遇“空格”、“TAB”、“回车”都结束
输入:jkljkljkl
输出:jkljkljkl
输入:jkljkl jkljkl //遇空格结束
输出:jkljkl
2、cin.get()
用法1: cin.get(字符变量名)可以用来接收字符
输入:jljkljkl
输出:j
用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格
输入:jkl jkl jkl
输出:jkl jkl jkl
输入:abcdeabcdeabcdeabcdeabcde (输入25个字符)
输出:abcdeabcdeabcdeabcd (接收19个字符+1个'\0')
用法3:cin.get(无参数)没有参数主要是用于舍弃输入流中的不需要的字符,或者舍弃回车,弥补cin.get(字符数组名,接收字符数目)的不足.
这个我还不知道怎么用,知道的前辈请赐教;
3、cin.getline() // 接受一个字符串,可以接收空格并输出
输入:jkljkljkl
输出:jklj
接受5个字符到m中,其中最后一个为'\0',所以只看到4个字符输出;
如果把5改成20:
输入:jkljkljkl
输出:jkljkljkl
输入:jklf fjlsjf fjsdklf
输出:jklf fjlsjf fjsdklf
//延伸:
//cin.getline()实际上有三个参数,cin.getline(接受字符串的看哦那间m,接受个数5,结束字符)
//当第三个参数省略时,系统默认为'\0'
//如果将例子中cin.getline()改为cin.getline(m,5,'a');当输入jlkjkljkl时输出jklj,输入jkaljkljkl时,输出jk
当用在多维数组中的时候,也可以用cin.getline(m[i],20)之类的用法:
请输入第1个字符串:
kskr1
请输入第2个字符串:
kskr2
请输入第3个字符串:
kskr3
输出m[0]的值:kskr1
输出m[1]的值:kskr2
输出m[2]的值:kskr3
4、getline() // 接受一个字符串,可以接收空格并输出,需包含“#include<string>”
输入:jkljkljkl
输出:jkljkljkl
输入:jkl jfksldfj jklsjfl
输出:jkl jfksldfj jklsjfl
getline()函数会生成一个包含一串从输入流读入的字符的字符串,直到以下情况发生会导致生成的此字符串结束。1)到文件结束,2)遇到函数的定界符,3)输入达到最大限度。
在函数遇到和结束定界符相等的字符时函数结束,同时函数抽出定界符,此种情况下该定界符既不被放回输入流,也不被放入要生成的字符串。所以由此可以理解输入结束后的第一个回车是定界符,被确认后抛弃,而第二个才是程序执行运行时正常需要的!
1函数介绍
C++有getline()函数(cin.getline()).
C有fgets(), gets()函数,也有getline.
cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数
主要功能是用于读取一行字符直到换行符,包括换行符.
2使用条件
linux标准C中使用条件:
#define _GNU_SOURCE
#include <stdio.h>
函数申明:
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
3返回值
成功:返回读取的字节数。
失败:返回-1。
参数:
lineptr:指向存放该行字符的指针,如果是NULL,则有系统帮助malloc,请在使用完成后free释放。
n:如果是由系统malloc的指针,请填0。
stream:文件描述符。
4应用举例
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE * fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
fp = fopen("/etc/motd", "r");
if (fp == NULL)
exit(EXIT_FAILURE);
while ((read = getline(&line, &len, fp)) != -1)
{
printf("Retrieved line of length %zu :\n", read);
printf("%s", line);
}
if (line)
free(line);
exit(EXIT_SUCCESS);
}5与get函数的区别
#include <iostream>
using namespace std;
int main( )
{
cout << "Type the letter 'a': ";
ws( cin );
char c[10]={'\0'};
cin.getline(c,10,'#');//将getline换成get试试,情况就大不相同了,呵呵
cout<<c<<endl;
char ch=cin.get();
cout<<"ch="<<ch;
if(ch=='\n')
{
cout<<"ch equals a new line operator "<<endl;
}
char ch2=cin.get();
cout<<"ch2= "<<ch2;
cin.get(c,10);
cout<<c<<endl;
cout<<cin.readsome(c,4)<<endl;
cout<<c<<endl;
cout << cin.gcount( ) << endl;
return 0;
}
// get(char*array,int count,char delim)与getline(char*array,int count,char delim)的不同点:
// 1.当输入的字符数小于count时遇到字符delim,get函数不会读取delim这个字符,而getline函数将读取这个字符但是不存进array当中去,而是将其丢弃,当然,两者都会在读取的字符串后面自动加上'\0'(teminator character)
// 2.当输入的字符数大于count时,则get函数只读取count-1个字符,而其余的字符仍然保存在缓冲区中,还可再对其进行读取;但是函数getline则不然。
// 如果输入行包含的字符数比指定要读取的字符多,那么get()和getline()读取指定数目的字符后,将把余下
// 的字符留在输入队列中。对get()而言,我们可以用另一条读取函数来读取留在输入队列中的数据,你也可
// 以写一段代码将余下的字符清除。不同的是getline()会设置失效位(faibit),并且关闭后面的输入,这个时候
// 用ch=cin.get();是读取不到留在输入队列中的字符的。你可以用下面的命
// 令来恢复输入:
// cin.clear();
// 因为clear()会重置失效位,打开输入。这个时候ch=cin.get();就可以读取留在输入队列中的字符。
// 外加ignore用法举例一则:
// basic_istream_ignore.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( )
{
char chararray[10];
cout << "Type 'abcdef': ";
cin.ignore( 5, 'c' ); //忽略前5个字符除非遇到字符'c',而停止忽略字符
//ignore的函数原型为:basic_istream& ignore(streamsize _Count = 1,int_type _Delim = traits_type::eof( ));(摘自MSDN)
cin >> chararray;
cout << chararray;
cout<<endl<<endl;
return 0;
}6其它输入输出流函数对比介绍
1、cin
2、cin.get()
3、cin.getline()
4、getline()
5、gets()
6、getchar()
附:cin.ignore();cin.get()//跳过一个字符,例如不想要的回车,空格等字符
1、cin>>
用法1:最基本,也是最常用的用法,输入一个数字:
#include <iostream>
using namespace std;
void main ()
{
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
}输入:2[回车]3[回车]
输出:5
注意:>> 是会过滤掉不可见字符(如 空格 回车,TAB 等)
cin>>noskipws>>input[j];//不想略过空白字符,那就使用 noskipws 流控制
用法2:接受一个字符串,遇“空格”、“TAB”、“回车”都结束
#include <iostream>
using namespace std;
void main ()
{
char a[20];
cin>>a;
cout<<a<<endl;
}输入:jkljkljkl
输出:jkljkljkl
输入:jkljkl jkljkl //遇空格结束
输出:jkljkl
2、cin.get()
用法1: cin.get(字符变量名)可以用来接收字符
#include <iostream>
using namespace std;
void main ()
{
char ch;
ch=cin.get(); //或者cin.get(ch);
cout<<ch<<endl;
}输入:jljkljkl
输出:j
用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格
#include <iostream>
using namespace std;
void main ()
{
char a[20];
cin.get(a,20);
cout<<a<<endl;
}输入:jkl jkl jkl
输出:jkl jkl jkl
输入:abcdeabcdeabcdeabcdeabcde (输入25个字符)
输出:abcdeabcdeabcdeabcd (接收19个字符+1个'\0')
用法3:cin.get(无参数)没有参数主要是用于舍弃输入流中的不需要的字符,或者舍弃回车,弥补cin.get(字符数组名,接收字符数目)的不足.
这个我还不知道怎么用,知道的前辈请赐教;
3、cin.getline() // 接受一个字符串,可以接收空格并输出
#include <iostream>
using namespace std;
void main ()
{
char m[20];
cin.getline(m,5);
cout<<m<<endl;
}输入:jkljkljkl
输出:jklj
接受5个字符到m中,其中最后一个为'\0',所以只看到4个字符输出;
如果把5改成20:
输入:jkljkljkl
输出:jkljkljkl
输入:jklf fjlsjf fjsdklf
输出:jklf fjlsjf fjsdklf
//延伸:
//cin.getline()实际上有三个参数,cin.getline(接受字符串的看哦那间m,接受个数5,结束字符)
//当第三个参数省略时,系统默认为'\0'
//如果将例子中cin.getline()改为cin.getline(m,5,'a');当输入jlkjkljkl时输出jklj,输入jkaljkljkl时,输出jk
当用在多维数组中的时候,也可以用cin.getline(m[i],20)之类的用法:
#include<iostream>
#include<string>
using namespace std;
void main ()
{
char m[3][20];
for(int i=0;i<3;i++)
{
cout<<"\n请输入第"<<i+1<<"个字符串:"<<endl;
cin.getline(m[i],20);
}
cout<<endl;
for(int j=0;j<3;j++)
cout<<"输出m["<<j<<"]的值:"<<m[j]<<endl;
}请输入第1个字符串:
kskr1
请输入第2个字符串:
kskr2
请输入第3个字符串:
kskr3
输出m[0]的值:kskr1
输出m[1]的值:kskr2
输出m[2]的值:kskr3
4、getline() // 接受一个字符串,可以接收空格并输出,需包含“#include<string>”
#include<iostream>
#include<string>
using namespace std;
void main ()
{
string str;
getline(cin,str);
cout<<str<<endl;
}输入:jkljkljkl
输出:jkljkljkl
输入:jkl jfksldfj jklsjfl
输出:jkl jfksldfj jklsjfl
3835

被折叠的 条评论
为什么被折叠?



