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

我们要实现这样的功能:

输入一个整数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’了)




















  • 26
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1.阶乘尾部0的个数 问题描述 给定非负整数n,计算n的阶乘尾部0的个数。 输入 输入数据有若干行,每行上有一个非负整数n,对应一种情形。 输出 对于每一种情形,直接输出结果、换行。 2.判断算式的正确性 问题描述 给定一个算式,该算式中只一个四则运算符号,操作数及结果均为整数。要求判断该算式的正确性(规定:除法必须除尽才算正确)。 输入 输入数据有若干行,每行上有一个算式,对应一种情形。 输出 对于每一种情形,直接输出T(表示正确)或F(表示错误),换行。 3.计算一系列实数的个数、最小值、最大值和“平均值” 问题描述 给定若干个(大于0且不超过1024)实数,计算其中数据的个数(n)、最小值、最大值,以及“平均值”。此处的“平均值”定义为,若n>2,则需去掉一个最大值、一个最小值,剩下的n-2个数据的算术平均值;若n为1或2,则为普通的算术平均值。 输入 输入数据有多行,每一行上有若干个实数,对应一种情形(数据之间用一个空格字符分隔)。 输出 对于每一种情形,依次输出数据的个数、最小值、最大值、平均值、换行。其中数据之间用逗号和空格分隔,浮点型数据保留2位小数。 4.字符串倒置 问题描述 对于给定的字符串,将其按字符倒置。 输入 输入数据有多行。每一行为一个字符串字符串长度小于1024,其中可能空格字符),对应一种情形。 输出 对于每一种情形,输出结果并换行。 5.字符在字符串中首次出现的位置 问题描述 给定一个字符、一个字符串字符串的长度小于1024),计算该字符在字符串中首次出现的位置。 输入 输入数据有若干行。每两行对应一种情形,这两行中的第一行上有一个字符(请注意将该字符后面的换行字符“吃掉”),第二行上有一个字符串字符串中可能有空白字符)。 输出 对于每一种情形,输出计算结果(若字符不在字符串中,则输出0),然后换行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值