【题解】ACM输入输出

一、 C++中各种输入函数的用法总结

1 scanf()/printf()函数

1.1 scanf()

  • 原型int scanf(const char *restrict format, ......);
  • 入口参数:第一个参数是格式字符串,它指定了输入的格式,......格式化后的字符串存取地址。
  • 返回值:函数返回值为int类型,如果读取到了“文件结束”则返回EOFEOFCtrl+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;
}
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇光_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值