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;}
