我们要实现这样的功能:
输入一个整数n,表示接下来要输入n行字符串,每一行字符串带有空格,按回车表示结束该行的输入
程序1:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s;
cout<<s<<endl;
}
return 0;
}
cin>>s不能接受空格输入
程序2:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
getline(cin,s);
cout<<s<<endl;
}
return 0;
}
程序2可以实现读入带空格的整行字符串,但只输入一行就结束了
细心的读者可以发现,在输入的数字下边出现空行
这是因为输入数字之后,敲回车,产生的换行符仍然滞留在输入流了,接着就被getline(cin,s)给读进去了,
此时的s=“\n”,所以在2的后边会有一个空行
同时for循环中的i也自增1,所以会少读一行
要解决这个问题,就要干掉滞留在输入流中的换行符
程序3:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
int n;
cin>>n;
cin.ignore();
for(int i=0;i<n;i++)
{
getline(cin,s);
cout<<s<<endl;
}
return 0;
}
这下就可以了
可以用getchar()代替cin.ignore()
getchar()读取输入流中的一个字符,所属头文件#include<cstdio>
还可以将
string s;
getline(cin,s);
换为:
char ch[256];
gets(ch);
我们不能用scanf("%s")输入字符串,因为它碰到空格或者TAB就会停下来,可以用下述两种方法解决这个问题:
第一种:
fgetc(fin),读取一个打开的文件fin,读取一个字符,然后返回一个int值
为什么返回的是int而不是char呢?
因为如果文件结束,fgetc将返回一个特殊标记EOF,它并不是一个char
如果把fgetc(fin)的返回值强制转换为char,将无法把特殊的EOF和普通字符区分开
如果要从标准输入读取一个字符,可以用getchar(),它等价于fgetc(stdin)
fgetc和getchar()将读取“下一个字符”,因此你需要知道在各种情况下,“下一个”字符是那个
如果用scanf("%d",&n)读取整数n,则要是在输入123后多加了一个空格,用getchar()读取的将是这个空格
如果在123后换行,则读取到的将是回车符“\n”
第二种:
fgets(buf,MAXN,fin)读取完整的一行放在字符数组buf中,其中buf的声明为buf[MAXN]
这个函数读取不超过MAXN-1个字符,然后在末尾添上结束符‘\n’,因此不会出现越界的情况
之所以说可以用这个函数读取完整的一行,是因为一旦读到回车符‘\n’,读取工作将会停止,而这个‘\n’也会是buf字符串中最后一个有效字符(再往后就是字符串结束符‘\0’了)