ACM-C++中的输入问题

本文最后更新于:December 3, 2021 pm

C++中的几种输入方式,以及记录一些在输入输出中可能会遇到的让人头大的坑。

一.输入带有空格的整行英语字母

1.cin

1
遇“空格”、“TAB”、“回车”就结束

2.cin.getline()

1
2
3
4
5
6
7
接收一个字符串,可以接收空格并输出。可以设置自定义结束符。
cin.getline(接收字符串的变量,接收字符个数,结束字符) //接收字符串的变量不能为string,需要是字符数组
当第三个参数省略时,系统默认为'\0'。接收n个字符到m中,其中最后一个为'\0',所以只看到n-1个字符输出.
例子
cin.getline(m,5,'a');
当输入jlkjkljkl时 输出 jlkj
输入jkaljkljkl时,输出 jk

3.getline()

1
2
3
接收一个字符串,可以接收空格并输出,需包含头文件“#include<string>”
string str;
getline(cin,str); //str需要是string,不能为字符数组

输入陨石坑

要求:输入一个数n,再输入一句由n个单词构成英文句子(包括空格)。用C++中的输入输出实现。

错误的输入方式一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int n;
cin>>n;
cout<<n<<endl;
string s;
getline(cin,s);
cout<<s<<endl;
//输入
25
abcd
//输出
25 //当输入25后按回车,程序就结束了。不能再输入后面的 abcd 字符串了。
//这里会空一个回车行

//但是,当你换一种输入方式时,又有另一种情况
//输入
25 abcd
//输出
25
abcd //字符串前面有一个空格

错误的输入方式二:

1
2
3
4
5
6
7
8
9
10
11
12
13
int n;
cin>>n;
cout<<n<<endl;
getchar(); //换成char ch=getchar() 也是同样的效果。c++中的清空输入缓冲区 cin.sync() 也不行
string s;
getline(cin,s);
cout<<s<<endl;
//输入
25
abcd
//输出
25
//这输出的是一句空字符串,没有任何的输出

正确的输入方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
int n;
cin>>n;
cout<<n<<endl;
cin.get(); //不能用getchar()函数
string s;
getline(cin,s);
cout<<s<<endl;
//输入
25
abcd
//输出
25
abcd

也可以定义两个string来实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
	int n;
cin>>n;
cout<<n<<endl;
string s,c;
getline(cin,c); //用来吃掉n后面的回车
getline(cin,s);
cout<<c<<endl;
cout<<s<<endl;
//输入
5
sfje few fwa
//输出
//这是一个回车,即字符串c
sfje few fwa

二.输入二维字符数组

C语言实现

代码一,用%s输入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
char a[minn][minn]; //m行n列的二维字符数组
int n,m;
while(cin>>n>>m){
for(int i=0;i<m;++i){
scanf("%s",&a[i]);
//getchar(); //这里的getchar()函数有无不影响最后的输出结果。需要与%c的方式输入时区别开
}
printf("\n");
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
printf("%c",a[i][j]);
}
printf("\n");
}
}
//输入
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
//输出
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.

代码实现二,用%c输入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
char a[minn][minn];
int n,m;
while(cin>>n>>m){
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
scanf("%c",&a[i][j]);
}
getchar();//这里的getchar()函数必须写,不然会出错。
}
printf("\n");
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
printf("%c",a[i][j]);
}
printf("\n");
}
}
//输入
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
//输出
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.

C++实现

代码实现一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
char a[minn][minn];
int n,m;
while(cin>>n>>m){
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
cin>>a[i][j]; //这里并没有使用getchar()之类的函数
}
}

cout<<endl;
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
cout<<a[i][j];
}
cout<<endl;
}
}
//输入
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
//输出
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.

代码实现二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
char a[minn][minn];
int n,m;
while(cin>>n>>m){
for(int i=0;i<m;++i){
cin>>a[i];
}

cout<<endl;
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
cout<<a[i][j];
}
cout<<endl;
}
}

//输入
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
//输出
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.

持续更新中······


本文作者: 墨水记忆
本文链接: https://tothefor.com/DragonOne/3486335530.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!