C语言 控制台输入输出入门

C语言 控制台输入输出入门

刚入门的时候练习C语言有很多途径。如鉴赏前辈的代码,临摹等。也有一种方法就是刷OJ(Online Judge)
那么本文就针对OJ中常见的输入输出做一个小的总结或是入门指引。
(文中C语言代码为>=C99标准,如果编译不通过,将for循环中初始条件移到循环外)

一、常见输入

  1. 单行
  2. 第一行输入总行数n,后跟n行
  3. 每一行开始一个数据个数n,后跟n个数据
  4. 遇到某标记结束
  5. 以上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. 直接输出单组数据
  2. 输出数组
  3. 输出数组(用空格隔开)
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
		每个数据之间有一个空格('_'代替空格)
	*/

结语

文章至此结束,初来咋到,欢迎斧正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值