C语言 控制台输入输出入门
刚入门的时候练习C语言有很多途径。如鉴赏前辈的代码,临摹等。也有一种方法就是刷OJ(Online Judge)
那么本文就针对OJ中常见的输入输出做一个小的总结或是入门指引。
(文中C语言代码为>=C99标准,如果编译不通过,将for循环中初始条件移到循环外)
一、常见输入
- 单行
- 第一行输入总行数n,后跟n行
- 每一行开始一个数据个数n,后跟n个数据
- 遇到某标记结束
- 以上4种的任意组合
接下来针对以上五种情况展开讨论。
1.单行输入
对于单行的格式化输入的用法,暂且不讨论。具体参考百度百科。
2.第一行输入总行数n,后跟n行
例如输入:
3
2
5
7
第一行的3为接下来输入的行数,显然我们需要用循环来储存用户输入的数据
int n;
int temp;
scanf("%d", &n); //获取接下来要输入的行数
for (int i = 0; i < n; i++) { //循环获取每行的数据
scanf("%d", &temp); //将整体的多行输入的大问题转化为每一行输入的小问题
/*
接下来是对temp变量的操作代码
整个循环内的代码应为对单行数据处理的代码
目的是将大问题化为小问题来解决
*/
}
3.遇到某标记结束
举个?
遇到‘@’字符结束
遇到‘A’字符结束
到行尾结束
到文件尾结束(停止输入时结束)
解决方案很简单,针对:
遇到字符结束的:
char n;
while (scanf("%c", &n), n!= '@') {
/*
对数据操作的代码
*/
}
while (scanf("%c", &n), n!= 'A') {
/*
对数据操作的代码
*/
}
while (scanf("%c", &n), n!= '\n') {
/*
对数据操作的代码
*/
}
遇到文件尾结束的:
int n;
while (scanf("%d", &n)!= EOF) {
/*
对数据操作的代码
*/
}
如果想要一次读取单行内容:
char str[LENGTH];
gets(str); //但是该代码存在内存泄露的危险,在今后的项目开发中用fgets代替为好
4.每一行开始一个数据个数n,后跟n个数据
例如输入:
3 1.0 2.3 3.9
2 -35.0 37
5 1 2 3 5 7
7 -9 8 4 6 5 1 0
对于此类问题,其实和问题二差的并不多,问题三应该是在问题二的基础上又上升了一个维度。
问题一是单维度,也就是单行单次输入;
问题二是二维度,即有多次单行输入;
问题四是三维度,即有多次多行(每行行首输入n,后跟n组数据与问题二类似)输入。
int n;
int temp;
while (scanf("%d", &n) != EOF) {/* 获取每行行首的该行数据个数
直到文件尾结束
这里的EOF可以理解为问题三中的结束标志
为EOF时
*/
for (int i = 0; i < n; i++) {/* 重复问题二的部分
将多批次输入化简为单次多行输入的小问题
*/
scanf("%d", &temp);
/*
接下来是对temp变量的操作代码
整个循环内的代码应为对单行数据处理的代码
目的是将大大问题化为大问题,再将大问题化简为小问题来解决
*/
}
}
5.以上4种的任意组合
该种情况就比较骚气了。也就是最常见的一种情况,题目要求比较复杂,但是根据实际情况合理的用以上四种情况去解析就会很容易拿下了。
上?
有输入:
3
2 3 2
3 -1 5 6
0
第一行输入T为T行数据,后每一行第一个为该行数据数量。
显然,此种为问题二与问题四的结合。
int n, T;
int temp;
scanf("%d", &T);
for (int i = 0; i < T; i++) {/* 重复T次,T次多组输入*/
for (int j = 0; j < n; j++) {/* 重复问题二的部分
将多批次输入化简为单次多行输入的小问题
*/
scanf("%d", &temp);
/*
接下来是对temp变量的操作代码
整个循环内的代码应为对单行数据处理的代码
目的是将大大问题化为大问题,再将大问题化简为小问题来解决
*/
}
}
二、常见输出
- 直接输出单组数据
- 输出数组
- 输出数组(用空格隔开)
1.直接输出单组数据
与输入的格式化基本相同,不再赘述
printf("%d\n", 2333);
printf("I'm %s\n", "哈哈哈");
printf("%2d:%2d:%2d\n", 19, 20, 34);
puts("Hello World");
putchar('a');
2333
I'm 哈哈哈
19:20:34
Hello World
a
2.输出数组
根据数组的类型自行选择
int arr[LENGTH];
for (int i = 0; i < LENGTH; i++) {//决定循环的次数
printf("%d\n", arr[i]);//输出换行还是空格或是其他格式自行选择
}
想要输出结构体,按照题目要求格式
//定义结构体
typedef struct Person {
int age;
int gender;
char name[20];
}Person;
//循环输出
for (int i = 0; i < LENGTH; i++) {
printf("Name:%s Age:%d Gender:%s\n",
arr[i].name,
arr[i].age,
arr[i].gender ? "Male" : "Female"
);//
3.输出数组(用空格隔开)
比较常见的一种问题方式,解决办法就是设置一个标志位,用来标记不同的输出。
int flag = 1; /*用来标记是否为不同输出
(例如第一个数据后不带空格,
以后的数据前跟一个空格)
*/
for (int i = 0; i < LENGTH; i++) {
if (flag) printf("%d", arr[i]), flag = 0; /*flag为1时输出单数据,不加空格
当执行完一次之后将flag置为0
*/
else printf(" %d", arr[i]);/*flag为0时输出一个空格加一个数据*/
}
/* 总的输出效果就是
1_2_3_4_5_6
每个数据之间有一个空格('_'代替空格)
*/
结语
文章至此结束,初来咋到,欢迎斧正。