您的位置:首页 > 编程语言 > C语言/C++

C++如何输入多行字符串(含空格)

2014-07-10 18:58 477 查看
我们要实现这样的功能:

输入一个整数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’了)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: