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’了)




















### 如何在C语言中输入多组字符串数组 在C语言中处理多个字符串数组可以通过定义二维字符数组来实现。下面展示了一个完整的例子,该程序允许用户输入指定数量的字符串并存储这些字符串到一个多维数组中。 ```c #include <stdio.h> #include <string.h> #define MAX_STRINGS 10 // 定义最多可以输入多少个字符串 #define STRING_LENGTH 50 // 每个字符串的最大长度加终止符'\0' int main() { char strings[MAX_STRINGS][STRING_LENGTH]; // 创建一个用于保存字符串的二维数组 int count; printf("Enter number of strings (max %d): ", MAX_STRINGS); scanf("%d", &count); if(count > MAX_STRINGS || count < 1){ printf("Invalid input.\n"); return 1; } getchar(); // 清除缓冲区中的换行符以便fgets正常工作 for(int i = 0; i < count; ++i) { printf("Enter string #%d: ", i + 1); fgets(strings[i], sizeof(strings[i]), stdin); // 输入单个字符串 size_t length = strlen(strings[i]); if(length > 0 && strings[i][length - 1] == '\n') { strings[i][length - 1] = '\0'; // 去掉结尾的新行字符 } } printf("\nThe entered strings are:\n"); for(int j = 0; j < count; ++j) { puts(strings[j]); // 输出每一个已读取的字符串 } return 0; } ``` 此代码片段展示了如何声明一个固定大小的二维字符数组`strings`,其中每一行代表不同的字符串[^1]。通过循环结构收集用户的输入,并利用`fgets()`函数安全地获取每条记录的内容。为了防止多余的换行符被包进来,在每次接收完数据之后会检查最后一个位置是否为`\n`,如果是则将其替换为空字符(`\0`)以标记字符串结束。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值