1.1 输入一行(带空格)字符串
输入一行字符串,遇到空格不停止,遇到换行符才停止输入.
输入格式
共一行,一个字符串.
输入:
Hello, How are you? |
---|
1.1.1 scanf正则表达式
scanf支持简单的正则表达式,可以利用正则表达式让scanf函数遇到换行符时停止读入.
板子:
#include <cstdio>
int main()
{
char str[100];
scanf("%[^\n]", &str);
return 0;
}
1.2 输入多行带空格字符串
输入n行字符串,遇到空格不停止,遇到换行符才停止输入.
输入格式
第一个输入整数n,代表字符串个数.
接下来n行,每行输入一个带空格的字符串.
输入:
6 Hello, How are you? I’m fine, thank you. When do you have time? This weekend. Do you want to play oudoor? Yes, let’s go. |
---|
1.2.1 scanf正则表达式
技巧:
scanf()
函数可以搭配简单正则表达式,scanf("%[^\n]",str)
语句的作用为:遇到回车时,把缓冲区里面的内容按字符串格式输入str中,但是回车保留在缓冲区里,因此下一次读入前需要用char c = getchar();
语句读取上一个回车。
板子:
#include <cstdio>
const int MAXN = 10010;
char strs[15][MAXN];
int main()
{
char c;
int n;
scanf("%d", &n);
c = getchar();
for (auto i = 0; i < n; ++ i) {
scanf("%[^%\n]",strs[i]);
c = getchar();
}
printf("\n");
for (auto i = 0; i < n; ++ i) printf("%s\n", strs[i]);
return 0;
}
如果想要避免下一个字符串读入缓冲区的回车,可以使用scanf("%*c)
来跳过当前缓冲区的第一个字符。
使用scanf("%*c)
来跳过缓冲区的换行符:
#include <cstdio>
const int MAXN = 10010;
char strs[15][MAXN];
int main()
{
char c;
int n;
scanf("%d%*c", &n);
for (auto i = 0; i < n; ++ i) scanf("%[^%\n]%*c",strs[i]);
printf("\n");
for (auto i = 0; i < n; ++ i) printf("%s\n", strs[i]);
return 0;
}
1.2 输入一行定长数字作为数组的值
输入一行定长数字字符串作为数组的输入值,数字字符之间用空格分隔.
输入格式
第一行有一个整数n,表示数组长度.
第二行有n个整数,表示要用数组存储的值,每个整数之间用空格隔开.
输入:
6 2 3 9 14 78 90 |
---|
1.2.1 直接输入
#include <iostream>
using std::cin;
using std::cout;
const int MAXN = 100010;
int main()
{
int n;
cin>>n;
int num[MAXN];
for (int i = 0; i < n; ++ i){
cin>>num[i];
}
return 0;
}
1.3 输入一行不定长数字作为数组的值
输入一行不定长数字字符串作为数组的输入值,数字字符之间用空格分隔.
输入格式
共一行,有n个整数,表示要用数组存储的值,每个整数之间用空格隔开.
输入:
2 3 9 14 78 90 |
---|
1.3.1 getchar()判断是否到行末
先输入第一个数字,然后在while循环中,交替:
(1)用字符变量c读入空格并判断是否是换行符(达到行末);
(2)读入数字,存储在数组中.
#include <iostream>
using std::cin;
using std::cout;
const int MAXN = 100010;
int main()
{
int num[MAXN];
int i = 0, temp;
char c;
cin>>num[i++];
while ((c = getchar()) != '\n') {
cin >> num[i++];
}
return 0;
}