文章目录
一、 C++中各种输入函数的用法总结
1 scanf()/printf()函数
1.1 scanf()
- 原型:
int scanf(const char *restrict format, ......);
- 入口参数:第一个参数是格式字符串,它指定了输入的格式,
......
格式化后的字符串存取地址。 - 返回值:函数返回值为
int
类型,如果读取到了“文件结束”则返回EOF
,EOF
为Ctrl+z
或者Ctrl+d
。其他情况则返回int
型数字,例如:int res = scanf("%d %d",&a,&b);
如果a,b都读取成功,则返回2;如果a,b只读取成功了一个,则返回1;如果a,b都没有读取成功,则返回0。 - 说明:
scanf()
函数是C语言库中的函数,但由于C++ 的向下兼容性,所以在C++中也可以使用此函数。此函数是从标准输入流stdio
(一般是键盘输入)中读取数据,并将其按照指定格式输入到指定地址。 - 头文件:
#include <stdio.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int a,b;
scanf("%d %d",&a,&b); //注意此处输入的格式,两个输入数字之间要以空格分隔开来。
printf("%d %d",a,b);
}
int n;
printf("please input a int number:");
scanf("%d", &n); //&取地址符,%d后面不加\n
printf("n:%d\n", n);
\n 换行
\t 制表符
%d 表示整数
%f 表示浮点数(小数)
%lf 表示双精度浮点数
%c 表示一个字符
%s 表示一个字符串
%03d 表示用3位输出一个整数,不够三位用0补齐
//eg:使用%03d 输出3时,printf(“a:%03d \n”,a);显示结果为003
%.2f 表示小数点后取两位,用于四舍五入
%1.3f 表示小数点前保留1位,小数点后保留3位
1.2 printf()
- 在使用
printf
向控制台输出时,不建议使用中文字符串,中文字符串的问题比较复杂,有些编译器对中文字符串不支持。可以使用拼音。 - 主要用于数据对齐
\n 换行
\t 制表符
%d 表示整数
%f 表示浮点数(小数)
%lf 表示双精度浮点数
%c 表示一个字符
%s 表示一个字符串
%03d 表示用3位输出一个整数,不够三位用0补齐
//eg:使用%03d 输出3时,printf(“a:%03d \n”,a);显示结果为003
%.2f 表示小数点后取两位,用于四舍五入
%1.3f 表示小数点前保留1位,小数点后保留3位
连续输出多个整数:
printf("%d,%d",a,b);
2 cin()类(此类命名空间都在std中,无需添加头文件)
2.1 cin>>函数(遇到空格、TAB、换行读取结束;不能读取空格、TAB、换行)
- 说明:当我们从键盘输入时,有一个缓冲区,当输入结束时会将所输入的数据存到缓冲区。而
cin>>
的作用就是从缓冲区读数据,所以当缓冲区数据本来就有残留时,会出现读取出错的问题。值得一提的是:cin
函数遇到空格、TAB、换行时读取结束。
int num;
while(cin >> num){}; //若输入其他类型(例如char、double),返回0循环结束
- 输入一个字符串
#include <iostream>
using namespace std;
void main()
{
char a[10];
cin >> a;
cout << a << endl;
}
输入:aaabbbccc
输出:aaabbbccc
输入:aaa bbb ccc
输出:aaa
- 输入一个数字
#include <iostream>
using namespace std;
void main()
{
int a, b;
cin >> a >> b;
cout << a + b << endl;
}
输入:1回车2回车
输出:3
2.2 cin.get()函数(遇换行符结束;可以接受空格)
- 原型:该函数有三种形式,分别是
char ch = cin.get(), cin.get(char ch), cin.get(array,length)
2.2.1 cin.get() 和 cin.get(char ch)的用法(接收单个字符)接收换行符
这两个函数功能基本一样,都是读取缓冲区的一个字符,遇到换行符结束,但是这两个函数都不会丢弃缓冲区里边的空格和换行符。char ch = cin.get(), cin.get(char ch)
这两句可得到相同的结果。
#include <iostream>
using namespace std;
void main()
{
char ch;
ch = cin.get(); // 或者cin.get(ch);
cout << ch << endl;
}
输入:jljkljkl
输出:j
2.2.2 cin.get(array,length)(可以接受空格,不接收换行符)
- 这个函数是从缓冲区读取字符串,其中
array
是字符串接受地址,length-1
是字符串长度,因为最后一个字符必须存储'\0'
结束符,所以此函数只能接受length-1
个字符。 cin.get(char* str,int length)
函数
#include <iostream>
using namespace std;
void main()
{
char a[20];
cin.get(a, 20);
cout << a << endl;
}
输入:jkl jkl jkl
输出:jkl jkl jkl
输入:abcdeabcdeabcdeabcdeabcde (输入25个字符)
输出:abcdeabcdeabcdeabcd (接收19个字符+1个’\0’)
2.3 cin.getline函数(可以接收空格,遇到换行结束,不接收换行(自己设定则接收),可以指定个数)
- 说明:接收一个长度为
length-1
的字符串,包括空格,遇到换行结束。 cin.getline(char* str,int length, '\n')
函数- 若自己设置截止符,
'\n'
回车截止符会自动失效,同时会接收回车。直至遇到截止符和EOF才终止操作。
#include <iostream>
using namespace std;
void main()
{
char m[20];
cin.getline(m, 5);
cout << m << endl;
}
输入:jkljkljkl
输出:jklj
//接受5个字符到m中,其中最后一个为’\0’,所以只看到4个字符输出;
//如果把5改成20:
输入:jkljkljkl
输出:jkljkljkl
输入:jklf fjlsjf fjsdklf
输出:jklf fjlsjf fjsdklf
cin.getline()实际上有三个参数:
cin.getline(接受字符串的m,接受个数5,结束字符)
。当第三个参数省略时,系统默认为’\n’
cin.getline(m, 5,'a'); //当输入jlkjkljkl时输出jklj,输入jkaljkljkl时,输出jk
当用在多维数组中的时候,也可以用cin.getline(m[i],20)
之类的用法:
#include <iostream>
#include <string>
using namespace std;
int main()
{
char m[3][20];
for (int i = 0; i < 3; i++)
{
cout << "\n请输入第" << i + 1 << "个字符串:" << endl; // //\n可以换行
cin.getline(m[i], 20);
}
cout << endl;
for (int j = 0; j < 3; j++)
{
cout << "输出m[" << j << "]的值:" << m[j] << endl;
}
}
请输入第1个字符串:
kskr1
请输入第2个字符串:
kskr2
请输入第3个字符串:
kskr3
输出m[0]的值:kskr1
输出m[1]的值:kskr2
输出m[2]的值:kskr3
3 getline()函数(可以接收空格。遇到换行结束,不接收换行(自己设定则接收),不可指定个数)
用例1:(在C++中,应包含头文件<string>
,读取字符串包含空格,遇到换行结束,不包括换行)
getline(cin, string str, '\n')
函数- 若自己设置截止符,
'\n'
回车截止符会自动失效,同时会读取回车 - (1)到文件结束,(2)遇到函数的定界符,(3)输入达到最大限度。
while(getline(cin,line))
这个语句中,while判断语句的真实判断对象是cin的状态,也就是判断当前是否存在有效的输入流。
(注意:这里默认回车符停止读入,按Ctrl+Z(Windows)(Ctrl+D(Linux))
或键入EOF
(参考MSDN)回车即可退出循环。)
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
getline(cin, str);
cout << str << endl;
}
输入:jkljkljkl
输出:jkljkljkl
输入:jkl jfksldfj jklsjfl
输出:jkl jfksldfj jklsjfl
#include<sstream>
#include<string>
string s;
getline(cin, s, ','); //第一种
string res;
stringstream ss(s);
getline(ss, res, ','); //第二中
//在这里设置‘#’为终止符时,当再输入’\n’时也不会影响。在#之前的内容都会照样输出。例如:
//输入: //含有’\n’的输入
Hello world!
You are wonderful!
Mr. Ling#wonderful!
//输出: //照样输出
Hello world!
You are wonderful!
Mr. Ling
和cin.getline()
类似,但是cin.getline()
属于iostream
流,而getline()
属于sstream
流,是不一样的两个函数
4 gets()函数(可以接收空格。遇到换行结束,不接收换行)
- 接受一个字符串,可以接收空格并输出,需包含“#include”
#include <iostream>
#include <string>
using namespace std;
int main()
{
char m[20];
gets(m); // 不能写成m=gets();
cout << m << endl;
}
输入:jkljkljkl
输出:jkljkljkl
输入:jkl jkl jkl
输出:jkl jkl jkl
类似cin.getline()
里面的一个例子,gets()
同样可以用在多维数组里面:
#include <iostream>
#include <string>
using namespace std;
int main()
{
char m[3][20];
for (int i = 0; i < 3; i++)
{
cout << "\n请输入第" << i + 1 << "个字符串:" << endl;
gets(m[i]);
}
cout << endl;
for (int j = 0; j < 3; j++)
{
cout << "输出m[" << j << "]的值:" << m[j] << endl;
}
}
请输入第1个字符串:
kskr1
请输入第2个字符串:
kskr2
请输入第3个字符串:
kskr3
输出m[0]的值:kskr1
输出m[1]的值:kskr2
输出m[2]的值:kskr3
自我感觉gets()
和cin.getline()
和getline()
的用法很类似,只不过cin.getline()
多一个参数罢了;
5 getchar()函数
- 原型:
int getchar(void);
- 返回值:读取成功返回用户输入的ASCII码,读取失败返回
EOF
- 头文件:
<string>
或者<stdio.h>
- 说明:接收一个字符的输入,包含空格,遇到换行符结束。
#include <iostream>
#include <string>
using namespace std;
int main()
{
char ch;
ch = getchar();
cout << ch << endl;
return 0;
}
输入:abc回车
输出:a
二、ACM输入输出习题
A+B(4)
输入描述:
输入数据包括多组。
每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100), n为0的时候结束输入。
接下来n个正整数,即需要求和的每个正整数。
4 1 2 3 4
5 1 2 3 4 5
0
输出描述:
每组数据输出求和的结果
10
15
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> vec;
int n;
while (cin >> n)
{
if (n == 0)
break;
int a;
while (cin >> a)
{
vec.push_back(a);
if (cin.get() == '\n')
break;
}
int sum = 0;
for (int i = 0; i < vec.size(); ++i)
{
sum += vec[i];
}
cout << sum << endl;
vec.clear();
}
return 0;
}
A+B(5)
输入描述:
输入的第一行包括一个正整数t(1 <= t <= 100), 表示数据组数。
接下来t行, 每行一组数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。
2
4 1 2 3 4
5 1 2 3 4 5
输出描述:
每组数据输出求和的结果
10
15
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
while (cin >> t)
{
while (t--)
{
int n, num, sum;
cin >> n;
sum = 0;
while (n--)
{
cin >> num;
sum += num;
}
cout << sum << endl;
}
}
return 0;
}
A+B(7)
输入描述:
输入数据有多组, 每行表示一组输入数据。
1 2 3
4 5
0 0 0 0 0
每行不定有n个整数,空格隔开。(1 <= n <= 100)。
输出描述:
每组数据输出求和的结果
6
9
0
#include <bits/stdc++.h>
using namespace std;
int main()
{
int num, sum;
sum = 0;
while (cin >> num)
{
sum += num;
if (cin.get() == '\n')
{
cout << sum << endl;
sum = 0;
}
}
return 0;
}
A+B(通过为0)
输入描述:
输入有多组测试用例,每组空格隔开两个整数
输出描述:
对于每组数据输出一行两个整数的和
#include <bits/stdc++.h>
using namespace std;
int main()
{
long a, b;
while (cin >> a >> b)
{
cout << a + b;
}
return 0;
}
字符串排序(1)
输入描述:
输入有两行,第一行n 5
第二行是n个空格隔开的字符串 c d a bb e
输出描述:
输出一行排序后的字符串,空格隔开,无结尾空格 a bb c d e
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<string> strs;
int num;
string sbuff;
cin >> num;
for (int i = 0; i < num; ++i)
{
cin >> sbuff;
strs.push_back(sbuff);
}
sort(strs.begin(), strs.end());
for (const string &s : strs)
{
cout << s << ' ';
}
return 0;
}
字符串排序(2)
输入描述:
多个测试用例,每个测试用例一行。
每行通过空格隔开,有n个字符,n<100
a c bb
f dddd
nowcoder
输出描述:
对于每组测试用例,输出一行排序过的字符串,每个字符串通过空格隔开
a bb c
dddd f
nowcoder
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
vector<string> vec;
while (cin >> s)
{
vec.push_back(s);
if (cin.get() == '\n')
{
sort(vec.begin(), vec.end());
for (int i = 0; i < vec.size(); ++i)
{
cout << vec[i] << ' ';
}
cout << endl;
vec.clear();
}
}
return 0;
}
字符串排序(3)
输入描述:
多个测试用例,每个测试用例一行。
每行通过,隔开,有n个字符,n<100
a,c,bb
f,dddd
nowcoder
输出描述:
对于每组用例输出一行排序后的字符串,用’,'隔开,无结尾空格
a,bb,c
dddd,f
nowcoder
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s, temp;
vector<string> vec;
while (cin >> s)
{
stringstream ss(s);
while (getline(ss, temp, ','))
{
vec.push_back(temp);
}
sort(vec.begin(), vec.end());
for (int i = 0; i < vec.size() - 1; ++i)
{
cout << vec[i] << ',';
}
cout << vec[vec.size() - 1] << endl;
vec.clear();
}
return 0;
}