输入不说明有多少个Input,以EOF为结束标志

C

1
2
3
4
5
int a, b;
// scanf 返回值为变量的个数,如果没有返回 -1,EOF 是一个预定义的常量 -1
while (scanf("%d %d", &a, &b) != EOF) {
// ...
}

C++

1
2
3
4
int a, b;
while (cin >> a >> b) {
// ...
}

输入不说明有多少个 Input,以某个特殊输入为结束标志

C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 示例 1
int a, b;
while (scanf("%d %d", &a, &b) != EOF && (a != 0 && b != 0)) {
// ...
}

// 或者
while (scanf("%d %d", &a, &b) != EOF && (a || b)) {
// ...
}

// 示例 2
int n;
while (scanf("%d", &n) != EOF && n != 0) {
// ...
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
// 示例 1
int a, b;
while (cin >> a >> b) {
if (a == 0 && b == 0)
break;
// ...
}

// 示例 2
int n;
while (cin >> n && n != 0) {
// ...
}

指示有 N 个 Input

C

1
2
3
4
5
6
7
8
int n;
scanf("%d", &n);

int a, b;
for (int i = 0; i < n; i++) {
scanf("%d %d", &a, &b);
// ...
}

C++

1
2
3
4
5
6
7
int n;
cin >> n;

int a, b;
while(n--) {
cin >> a >> b;
}

指示有 N 组输入,并以某个特殊输入退出

C++

1
2
3
4
5
6
7
8
int n;
while (cin >> n && n != 0) {
int a, b;
for (int i = 0; i < n; i++) {
cin >> a >> b;
// ...
}
}

输入是一整行(包括空格)

用 char[] 接收(C/C++)

1
2
3
4
5
6
7
8
9
10
const int MAXN = 1000;
char buff[MAXN];

// C
gets(buff);
puts(buff); // 输出

// C++
cin.getline(buff, MAXN); // 第三个参数默认是 '\n'
cin.getline(buff, MAXN, '\n');

用 string 接收(C++)

1
2
3
string s;
getline(cin, s); // 第三个参数默认是 '\n'
getline(cin, s, '\n');

输入是多行(包括空格)

C++

1
2
3
4
5
6
7
8
int n;
cin >> n;
cin.get(); // 否则,n 也会计入下面的 getline(),导致少一组数据

while (n--) {
string s;
getline(cin, s);
}

从文件读取

C

1
2
3
4
5
6
7
8
9
10
11
FILE *cfin = fopen("in.txt", "r");
FILE *cfout = fopen("out.txt", "w");

int a, b;
// 注意要传入文件指针
while (fscanf(cfin, "%d %d", &a, &b) != EOF) { // 类似的,把 scanf 替换成 fscanf
fprintf(cfout, "%d\n", a + b); // 把 printf 替换为 fprintf
}

fclose(cfin);
fclose(cfout);

C++

1
2
3
4
5
6
7
8
9
10
ifstream fin("in.txt");
ofstream fout("out.txt");

int a, b;
while (fin >> a >> b) {
fout << a + b << endl;
}

fin.close();
fout.close();