背景
写算法时,经常会遇到输入的要求,一般分为三种,以int数字为例,分为输入单个、多个、未知个几种情况,有时需要考虑换行符‘\n’的问题
输入单个
此时使用直接scanf操作即可
int temp;
scanf("%d",&temp);
输入多个
数量不多时,直接scanf操作,数量多可以使用for循环进行输入
int nums[10]={0};
scanf("%d %d %d %d",&nums[0],&nums[1],&nums[2],&nums[3]);
//or
for(int i = 0;i<10;i++)
scanf("%d",nums[i]);
输入未知个
使用换行符作为结束条件
可以将scanf结合getchar一起使用,使用getchar()获取换行符作为结束的条件。
int temp[10];
int i = 0;
while(1)
{
scanf("%d",&temp[i]);
i++;
char ch = getchar();//获取缓冲区字符
if(ch == '\n')
break;
else
cout<<ch<<" ";
}
for(int j = 0; j<i; j++)
cout<<temp[j]<<" ";
上述代码,测试用例:
1 2 3 4 5
1 2 3 4 5
可以看到,scanf获取数字后,getchar获取了数字后的字符,getchar先后获得了4个空格“ ”,最后获得了换行符“\n”。
模板:
int nums[100];
int N = 0;
do
{
scanf("%d",&nums[N++]);
}
while(getchar()!='\n');
使用Ctrl+D(Linux)或Ctrl+Z(win)作为结束条件
EOF是文件结束标志,标准输入要输入EOF需要通过通过输入键盘组合键,ctrl+d(Linux)或ctrl+z(Windows)。
步骤:
- 输入多组数据,日“1 2 3 4 5”
- 回车,触发IO操作,scanf是忽视换行符的
- window下按组合键“Ctrl+Z”,输入结束
int i=0;
int temp[10];
while(scanf("%d",&temp[i])!=EOF)
{
i++;
}
for(int j = 0; j<i; j++)
{
cout<<temp[j]<<" ";
}
模板:
int nums[100];
int N = 0;
while(~scanf("%d",&nums[N++]));
for(int j = 0; j<N-1; j++)
{
printf("%d ",nums[j]);
}
关于EOF的更多解释,查看https://blog.csdn.net/henu1710252658/article/details/83040281
关于while(cin>>n)
的分析,这里不讨论,
参考:https://www.cnblogs.com/tgycoder/p/4958519.html
getchar
getchar是字符函数,返回值是对应字符的assic值。注意,getchar不接受字符串,输入字符串只能使用获取第一个字符。可以使用gets()获取字符串,与scanf(“%s”)不同的是,gets可以接收空格等,这也是它存在的意义。
char temp = getchar();
cout<<temp<<endl;
//输入:wuhan
//输出:w
gets
char temp[10] ;
gets(temp);
cout<<temp<<endl;
可以接受空格:
处理换行符
首先知道为什么需要处理换行符?
案例:
如我需要接收一个数字和一个字符串,利用scanf接受数字后,使用gets接受字符串,结果输入数字后程序直接结束了。
分析:
scanf()函数运行时,Enter触发I/O操作,即换行符是输入结束的标志。此时,所有的输入均保存在缓冲区中,包括最后的换行符“\n”。而scanf不会读取换行符,所以最后换行符滞留在换行符中。同时,gets函数的结束的判断条件是换行符,所以此时gets函数获取换行符后直接结束了输入。
在这种情况下,需要用getchar()来吃掉回车;
如:
哪些时候需要处理换行符
当你输入一次后,进行第二次输入时但是程序直接结束了,此时需要考虑是否换行符需要处理。因为一些函数忽视换行符,而一些函数不忽视换行符。不忽视时,通常作为输入的结束标志。
(1)使用gets()前处理滞留的换行符
(2)2个使用getchar接收字符,中间需要一个空的getchar()吃回车
C++语言中,换行符案例:https://blog.csdn.net/u012712087/article/details/48008745
cin和scanf时忽视换行符的,cin.getline和gets都是不忽视换行符的。