【输入输出】ACM模式输入输出处理

输入

cin

#include 

批量输出

// 1 2 3 4 5
vector nums(5);
for (int i = 0; i < nums.size(); i++) {
	cin >> nums[i];
}
// 批量输出
for (auto it = nums.begin(); it != nums.end(); it++) {
	cout << *it << " ";
}

getline()

读取一整行字符串(包括空格等字符),默认换行符结束。

两种用法:

getline()

#include 

istream& getline (istream&  is, string& str);
istream& getline (istream&& is, string& str);
istream& getline (istream&  is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim); 

  • is:输入流,如cin
  • str:string,保存读取的字符串
  • delim:char,定义结束符,默认为 '\n'
string str;
getline(cin, str, '#'); // 以#作为结束符

cin.getline()

#include 

istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim);

  • 从istream中读取 n 个字符,保存到 s
  • delim:结束符,会被读取,但不会保存到  s 中
char str2[10];
cin.getline(str2, 10);

与while组合使用

while (getline(cin, str), str != "#") {
    // 循环
}  

getchar()

#include 

输入实例

一组,组内数目未知,空格隔开

1 2 3 4 5 ……

vector Arr;        // vector str;
int arr;
while (cin >> arr) {
    Arr.push_back(arr);
    // 读到换行符结束循环
    if (getchar() == '\n')   
        break;
}

未知多组,每组内n个元素,n为0时结束:

n n个数

1 2

2 1 2

3 1 2 3

……

0

int n;
while (cin >> n && n != 0) {
    int tmp = 0;
    while (n--) {
        cin >> tmp;
    }
}

未知多组,每组内未知

不知道多少组,不知道组内多少数

  • #include
  • cin.get() 
int cur;
while (cin >> cur) {
    if (cin.get() == '\n') {
        // ***
    }
}

逗号分隔输入

char存储逗号

定义char存储每行逗号。注意最后一个元素后没有逗号,要单独处理。

1,2,3,4,5,……

int n;
cin >> n;
char s;
vector nums(n);
for (int i = 0; i < n - 1; i++) {
    cin >> nums[i] >> s;
}
cin >> nums[n - 1];

一行字符串,逗号分隔

hello,world,

  • #include
  • substr()
vector strs;

string s;               // 读入字符串
getline(cin, s);

int i = 0;              // 分隔
for (int j = 0; j < s.size(); j++) {
    i = j;
    while (s[i] != ';' && i < s.size()) {
        i++;
    }
    string tmp = s.substr(j, i - j);
    strs.push_back(tmp);
    j = i;
}

n组数,每组逗号/空格分隔

5
101,1
102,2
103,3
104,1,2,3,4
105,5

int n, num;
cin >> n;
vector> nums(n);
for (int i = 0; i < n; ++i)
{
    while (cin >> num)
    {
        nums[i].push_back(num);
        if (cin.get() == '\n') 
            break;
    }
}

未知多组,每组逗号分隔

vector strs;
string s;
string tmp;
while (cin >> s) {
    for (int i = 0; i < s.size(); i++) {
        if (s[i] != ',') {
            tmp += s[i];
        }
        else {
            strs.push_back(tmp);
            tmp.clear();
        }
    }
    strs.push_back(tmp);  // 最后一个字符串后面没有逗号
    tmp.clear();

    sort(strs.begin(), strs.end()); // 一些操作
    strs.clear();
}

输出

printf()

#include 

printf("格式控制字符串", 输出表列);

-格式控制字符串:%[标志][最小宽度][.精度][类型长度]类型

类型 对应数据类型 含义 示例

f

lf

float

double

浮点数输出精度

(可混用)

printf("%.2f", 0.123);

// 0.12

e / E float(double)

科学计数法

(e/E代表输出时的大小写)

printf("%e", 0.000000123);

// 1.230000e-07

g / G float(double)

自动选择以最短的方式输出

(大小写对应科学计数法e的大小写)

printf("%G", 0.000000123);

// 1.23E-07

c char 把输入的数字按ASCII码转为对应字符输出

printf("%c", 65);

// A

setprecision()

#include 

控制精度时会四舍五入

  • cout.unsetf()
  • cout.precision()
float a = 1.23456789;
    // 控制整个数的输出精度
cout << setprecision(2) << a;    // 1.2
    
    // 控制小数位输出精度
    // 也可以预先 cout.setf(ios::fixed);
cout << fixed << setprecision(2) << a;    // 1.23

    // 添加fixed后效果会一直保留,消除fixed效果
cout.unsetf(ios::fixed);

    // 重新设置精度
cout.precision(6);

输出实例

浮点数输出精度

输出浮点数,保留两位小数

单精度 f,双精度 lf,其实可以混用(scanf不能混用)

printf("%.2f", test);
printf("%.2lf", test);

补充

二维数组定义

int m, n;         // m×n
cin >> m >> n;
vector> Arr2(m, vector(n));

访问字符串数组中某字符串内的某个字符

string test[2];
test[0] = "hahaha";
test[1] = "nihao";
cout << test[0] << endl;    // hahaha
cout << test[0][1];         // a

你可能感兴趣的:(编程,c++)