C语言中的输入输出函数

时间:2021-08-04
本文章向大家介绍C语言中的输入输出函数,主要包括C语言中的输入输出函数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

输入输出函数

1、简单概述

前面在介绍中也提到了,计算机需要来处理数据,然后将处理完成后的结果输出。

在C语言简单入门中提供了两个函数来操作输入和输出的。

printf():打印,将结果打印在控制台上;

scanf():扫描键盘上敲下的数据赋值给变量;

2、printf函数

输出函数,四种用法:

2.1、第一种用法

# include <stdio.h>
int main(void){
	
	printf("hello,c\n");
	
	return 0;
}

控制台显示:

hello,c

--------------------------------
Process exited after 0.3468 seconds with return value 0
请按任意键继续. . .

那么一直这样写,为何要加上一个\n呢?

再看下不加的情况:

# include <stdio.h>
int main(void){
	
	printf("hello,c");
	
	return 0;
}

看下控制台显示:

hello,c
--------------------------------
Process exited after 0.5481 seconds with return value 0
请按任意键继续. . .

对比下,可以看到,不加\n和加了\n,控制台中少了一行空格。那么这个空格就是因为\n造成的。

因为计算机中无法通过一个字符来描述空格,所以只能通过多个来进行描述。这种字符是比较特殊的,叫做转义字符。

2.2、第二种用法

直接看程序,然后总结:

# include <stdio.h>
int main(void){
	
	int i = 520;
	printf("%d",i);
	
	return 0;
}

看下控制台输出:

520
--------------------------------
Process exited after 0.1145 seconds with return value 0
请按任意键继续. . .

其中,%是输出控制符,d表示的是将i变量对应的01代码以十进制的格式输出。这里终于明白了以前为什么要这么来写了。

说明了在C语言中使用的编码是ASCII码表的方式,在idea中使用的UTF-8,可以输出任意的字符和数据。

也就是手将变量对应的二进制数据以什么样的格式进行输出。

%d:输出变量对应的01代码以十进制格式输出整数;

%ld:输出变量对应的01代码以十进制格式输出长整型整数(long int);

%x(%X或者%#X):输出变量对应的01代码以十六进制输出整数;其中#X是常用的,因为要以十六进制为标识输出;保证可读性好,java里面采用的也是十六进制的;

%o:输出变量对应的01代码以八进制格式输出整数;

%c:输出变量对应的01代码以字符格式输出;

%f:输出变量对应的01代码以小数格式输出;

%lf:输出变量对应的01代码以成小数格式输出长类型小数(double);

# include <stdio.h>
int main(void){
	
	int i = 10;
	printf("%x\n",i);
	printf("%X\n",i);
	printf("%#x\n",i);
	printf("%#X\n",i);
	return 0;
}

控制台输出:

a
A
0xa
0XA

--------------------------------
Process exited after 0.1815 seconds with return value 0
请按任意键继续. . .

控制台显示更加通俗易懂。

2.3、第三种用法

# include <stdio.h>
int main(void){
	
	int i = 10;
	int j = 5;
	printf("%d %d\n",i,j);
	
	return 0;
}

控制台输出多个变量的值,一个输出控制符对应的是一个变量的值,不能够多一个,也不能少一个,一一对应:

10 5

--------------------------------
Process exited after 0.1213 seconds with return value 0
请按任意键继续. . .

2.4、第四种用法

# include <stdio.h>
int main(void){
	int i = 100;
	printf("value is:%#X\n",i);
	return 0;
}

控制台显示:

value is:0X64

--------------------------------
Process exited after 0.1651 seconds with return value 0
请按任意键继续. . .

非控制符以原来的字符进行了输出。

2.5、为什么需要输出控制符

首先明确一点:01所组成的代码既可以表示成指令,也可以表示成数据;因为01代码本身没有含义,但是如何去解读01代码成为了关键

01代码以不同的格式进行解读,那么得到的值可能是不一样的。最简单的方式验证如下:

# include <stdio.h>
int main(void){
	int i = 100;
	printf("value is:%d\n",i);
	printf("value is:%f\n",i);
	printf("value is:%lf\n",i);
	printf("value is:%#X\n",i);
	printf("value is:%0\n",i);
	return 0;
}

控制台显示如下:

value is:100
value is:0.000000
value is:0.000000
value is:0X64
value is:

--------------------------------
Process exited after 0.6483 seconds with return value 0
请按任意键继续. . .

可以看到对于存储在内控空间中的一段01代码,以不同的格式来进行解读,发现对应的值也是不同的;

3、scanf函数

从键盘上录入字符,将字符转换成输入函数中对应格式的数据。一定要记住,从控制台录入进去的都是字符!

操作系统将字符转换成对应的类型,所以这里就可能会出现问题。所以要找规定的数据类型来进行转换。

# include <stdio.h>
int main(void){
	int i ;
	// scanf("i value is: %d",&i);
	printf("请输入i的值: \n");
	// 不能够在前面加上非操作符,因为要是加上了,在控制台上进行输入的时候,还得加上:i value is: ,比较麻烦,所以这里用输出函数代替一下 
	scanf("%d\n",&i);
	printf("i vlaues is:%d\n",i);
	return 0;
}

控制台输出:

请输入i的值:
10
10
i vlaues is:10

--------------------------------
Process exited after 3.174 seconds with return value 0
请按任意键继续. . .

发现了三个问题:

1、输入的时候,指定对应的数据格式;不要多写,要是多写的话要加上对应的数据;

2、输入的时候,发现输入了两次i的值,然后才输出了变量i的值;

3、在输出控制符中,对于变量的操作没有加&,而对于输入控制符来说,却加上了。为何?规定而已

对于输入函数来说,加上了&表示的是,将i变量对应的内存地址取出来,然后将01代码写入内存地址空间中去;
对于输出函数来说,直接操作变量i对应的内存地址空间中的01代码取出来,然后按照输出格式来进行输出;    

这跟java中是一模一样的,但是java使用了utf-8之后,将对应变量的地址中的值取出来之后,因为变量规定了数据类型,那么就按照指定的数据类型来进行显示。

所以注意的是在输入控制符中,不要输入于输入控制符无关的非输入控制符

继续去看上面的问题:为什么输入完一个值之后,还需要我输入第二个值才能够进行输出呢?

原因就在于scanf这个函数,\n是它的结束,这个是隐式的,而不是显示的。键盘上的Tab和Enter都是隐式的。如果显示的写上了,那么scanf要求,你输入的就需要带上\n

# include <stdio.h>
int main(void){
	int i ;
	printf("请输入i的值: \n");
    // 这里加上了\n,发现怎么输入都没有用,于是加上了\n,发现输入成功了。那么也就是说scanf里面要求显示的写了什么非操作符在输入的时候就得加上什么非操作符
    // 所以说这里是非常不好的输入格式
	scanf("%d\n",&i);
	printf("i vlaues is:%d\n",i);
	return 0;
}

这里从网上查了一下资料:

Enter对应的ASCII码表中的的\n;Tal对应的是空格,对应的是ASCII码表中的0;

在C语言中,输入函数把用户输入的键盘上的内容全部当做是字符来处理,利用了一个缓冲区

比如说:键盘上输入:

123456789abcd

如果代码中写的是:

# include <stdio.h>
int main(void){
	printf("请输入i的值:\n");
	int i;
	scanf("%d",&i);
	scanf("%d",&i);
	printf("i的值是:%d\n",i);
	
	return 0;
} 

我在控制台上进行输入的时候:

请输入i的值:
12m
i的值是:12

--------------------------------
Process exited after 4.391 seconds with return value 0
请按任意键继续. . .

将我从控制台上的m给过滤掉了,因为操作系统在将字符串转换的时候,发现m无法存入到int类型的变量中去,就从这里开始自动忽略掉了

但是不能够将m放在最前面,dev编译器自动赋值为0;

再看一种情况:

# include <stdio.h>
int main(void){
	printf("请输入i的值:\n");
	int i,j;
	scanf("%d",&i);
	scanf("%d",&j);
	printf("i的值是:%d\n",i);
	return 0;
}

我从控制台输入:

123456a

发现没有报错,直接输出了:

请输入i的值:
123456a
i的值是:123456
j的值是:1

--------------------------------
Process exited after 3.26 seconds with return value 0
请按任意键继续. . .

发现无论在123456后面写什么,j输出的都是1。

为了解决这种问题,引用了比较常见的解决方式:

# include <stdio.h>
int main(void){
	printf("请输入i的值:\n");
	int i,j;
	scanf("%d",&i);
	char ch;
	printf("请输入j的值:\n");
	while( (ch = getchar() ) != '\n'){
		continue;
	}
	scanf("%d",&j);
	printf("i的值是:%d\n",i);
	printf("j的值是:%d\n",j);
	return 0;
}

在控制台输入:

请输入i的值:
12345 jkljkljkkjfdklsjafljslf dklsafjldsjafkldjsalfjdasdkljsfjas
请输入j的值:
1
i的值是:12345
j的值是:1

--------------------------------
Process exited after 11.41 seconds with return value 0
请按任意键继续. . .

这里说明了,操作系统只会从控制台挑选出来指定的符合的来给变量赋值,不符合不赋值;

然后选择隐式的\n来作为换行,输入下一行,知道选择到用户输入的合适的地方,所以这一块的内容很有意思。

但是第一次输入的赋值上了,如果第二次依然无法和对应的数据类型匹配,那么依然会有默认值。

所以输入函数比较强大。所以输入函数掌握好。

千里之行,始于足下。不积跬步,无以至千里

原文地址:https://www.cnblogs.com/likeguang/p/15100878.html