【20180626】【C/C++基础知识】C语言数据转换,数据的输入输出格式、函数:scanf_s,printf,getchar,putchar

1. 数据类型转换

    (1) 相同类型数据的运算结果,还是该类型;

    (2) 不同类型的数据的运算结果是取值范围大的那种。

    (3) 取值范围小的类型赋值给取值范围大的类型是安全的,反之不安全。

    (4) 浮点数转为整数是截断(丢失小数部分,不是四舍五入)。

    (5) 为了消除警告:强制类型转换(强转)可以消除从大到小的警告。可以通过下面方式把表达式的值转为任意类型:(类型)表达式,例如:

int x=10;
Float y;
y = (float)x;  // x值不改变,只是将转换了的x值赋给y

2. 数据的输入输出

    C语言提供了标准的输入输出库。

    (1) 格式输出函数printf

    基本形式:printf("控制字符串”,输出项列表),输出项可以是变量、常量、表达式,其间用逗号分隔。

    格式控制字符串:格式说明符、普通字符

    格式控制说明:%字符 ,例如:%c按字符型输出,%d按十进制整数输出,%u按无符号整数输出,%f按浮点型小数输出,%o按八进制整数输出,%x按十六进制整数输出,%s按字符串输出。

    使用修饰符:宽度、精度、小数位数、对齐方式等。字段宽度:%6d表示以字节宽度为6字节显示一个整数。例如:

i = 123;
printf(“%6d\n”,i); // 输出:___123(有三个空格)
printf(“%06d\n”,i); // 输出:000123(补零)

j = 1234.567;
printf(“%9.3f\n”,j); // 输出:_1234.567总共占9个字段,小数点占3个字段

    负号:不用负号为右对齐,有负号是左对齐。

    字符*:指定输出的字段宽度,例如:

printf(“%*d\n”,w,i);  // 指定字段宽度为w
printf(“%*.*f\n”,7,2,x); // 指定字段宽度为7,并且小数点后长度为2

    %%两个百分号表示百分号,%t表示一个tab键。输入输出函数都在头文件,若只有printf和scanf,那么头文件可省略。

    普通字符:原样输出的字符,可打印字符:直接写出字符,不可打印字符:使用转义字符\n,\t,\a

    (2) 字符输出函数——putchar(将一个字符输出在显示屏上,显示参数可以是字符变量、字符常量、字符ASCII码)

putchar('A');   // 显示大写字母A
putchar(97);  // 显示小写字母a,里面数字都表示ASCII码

   (3) 格式输入函数——scanf

    基本形式:scanf(”控制字符串”,输入项列表)

    注意:接收数据的变量必须用其地址表示,加一个&!

    控制字符串与输出的表示方法类似,注意不同点:字符*:输入时用来跳过相应的数据(输入*用来跳过,输出*用来控制字段长度)!例如:

scanf("%d%d",&i,&j); // 输入分别存到i和j中
scanf("%*d%d",&i,&j); // 跳过第一个数,读取第二个数并存到i中

    空格字符:输入字符型数据时,用来跳过输入流中所有空格字符(不管有几个空格字符,输入一个空格字符表示跳过所有空格字符)。例如:

若输入45 20 a:

scanf("%d%d%c",&i,&j,&ch);  // 输出会是45 20 空格
scanf("%d%d %c",&i,&j,&ch);  // 输出是45 20 a

/* 注意:只有输入字符型数据时需要加空格跳过所有空格,输入数值型数据时不需要,它会自动跳过! */

    可打印字符:去除输入数据流中与可打印字符相同的字符

scanf("%d%d",&i,&j);  // 注意:输出格式按照后面那里来,后面是空格那么输出是空格,输出是逗号那么输出是逗号

   (4) 字符输入函数——getchar

    基本形式:getchar(),无参数,只能接收一个字符。

    作用:从键盘输入一个字符,函数的返回值为该字符的ASCII码,使用时,通常将返回值赋予某个字符变量或整型变量。

程序1:输入一个字符,输出它的前导/后续字符,并分别按照字符和整数格式输出。

    思路:前导:ASCII码-1,后续:ASCII码+1.

/* 输入一个字符,并输出它的前导、后续字符,并分别按照字符、整数输出 */
/*正确的程序 */
#include<stdio.h>
#include<stdlib.h>
int main()
{
	char c;
	int c1, c2;
	c = getchar();
	c1 = c - 1;
	c2 = c + 1;
	printf("%c\t%c\t%c\n", c1,c,c2);
	printf("%d\t%d\t%d\n", c1, c, c2);
	system("pause");
	return 0;
}

程序2:温度转换,将输入的摄氏温度值转化为华氏温度输出。

    思路:转换公式:C=5/9*(F-32)

/* 将摄氏温度转换为华氏温度 */
/*正确的程序 */
#include<stdio.h>
#include<stdlib.h>
int main()
{
	float Ctemp,Ftemp;
	printf("请输入一个摄氏温度值:\n");
	scanf_s("%f", &Ctemp);
	Ftemp = Ctemp * 9 / 5 + 32;
	printf("转换后的华氏温度为:%.2f\n", Ftemp);
	system("pause");
	return 0;
}
程序3:小明家廉租房

/* 小明家 */
/*正确的程序 */
#include<stdio.h>
#include<stdlib.h>
int main()
{
	float xm = 0, bb = 3.5, mm = 1.5,remain;
	if ((xm + bb + mm) > 6)
	{
		printf("小明家不满足廉租房要求\t");
		remain = (bb + mm + xm) - (300 / 10000 * 12);
		printf("小明家还剩余%.2f万元\n", remain);
	}
	else
	{
		printf("小明家满足廉租房要求\t");
		remain = (bb + mm + xm) - (1000 / 10000 * 12);
		printf("小明家还剩余%.2f万元\n", remain);
	}
	system("pause");
	return 0;
}
我编写的程序出现这样一个错误,原因是因为if-else忘记加{ }。
 

程序3:输入两个整数,输出它们的和。

/* 输入两个整数,输出它们的和 */
/* 我写的程序 */
# include"stdio.h"
#include"stdlib.h"
int main()
{
	int a, b,c;
	printf("请输入两个整数%d%d:;\n");  // 错误:printf没有为格式字符传递足够的参数,应该把%d去掉!
	scanf_s("%d%d", &a, &b);
	c = a + b;
	printf("这两个整数的和为%d+%d=%d", a+b=c);  // 错误(1):printf没有为格式字符传递足够的参数(应该把后面的+和=去掉)
	                                         // 错误(2):“=”左操作数必须为左值(把后面的+和=去掉)
	system("pause");
	return 0;
}
/* 正确的程序 */
# include"stdio.h"
#include"stdlib.h"
int main()
{
	int a, b,c;
	printf("请输入两个整数:;\n");
	scanf_s("%d%d", &a, &b);
	c = a + b;
	printf("这两个整数的和为%d+%d=%d", a,b,c);
	system("pause");
	return 0;
}

我的错误:输出里的格式字符,后面数值只需要一一对应就可以,后面形式与前面格式字符不需要格式保持一致。

编程后回答一下问题:

(1) 空格、回车、逗号分隔输入的两个整数,分别输出什么?

 scanf_s中间没有任何分隔符时:空格正常,回车正常,逗号不正常。说明:除了格式字符之外的其他字符都需要原样输入。但若原样输入了逗号,此时再用空格和回车会报错。 

(2) 用回车分隔输入,scanf_s("%d\n%d\n",&a,&b)这样对吗?

不对,这样会没有输出结果。若想回车输出,那么直接什么都不加就可以。

(3) 如果要求输入符号+,也就是输入3+5,输出3+5=8,怎么写?(见下面程序)

(4) scanf_s对字符类型数据有没有特殊要求?

 对字符型数据,scanf_s需要指明字符的个数(和scanf函数的不同之处)

# include"stdio.h"
#include"stdlib.h"
int main()
{
	int a, b, c;
	char ch;
	printf("请输入两个整数:;\n");
	scanf_s("%d+%d", &a, &b);
	scanf_s("%c\n", &ch,1);  // scanf_s函数用字符类型数据时,必须注明字符个数!!
	c = a + b;
	printf("%c\n", ch);
	printf("这两个整数的和为%d+%d=%d\n", a, b, c);
	system("pause");
	return 0;
}
 

总结:

1. 字符型的最大值、最小值是多少?

字符型数据占1个字节(8位),是有符号的,最高位是符号位,因此它的范围是-128~127。2个字节的无符号整数的最大值是多少? 2^16-1。

 2. 'x'和"x"什么区别?

'x'是字符x,"x"是字符串x,除了存储x的ASCII码值,还要存储字符串结束符\0,所以占两个字节空间。

3. '0'和'\0'相等吗? 

不相等!'0'的ASCII码值为48,'\0'的ASCII码值是0 

4. sizeof("computer")的值是多少?

9。因为字符串以NULL或者'\0'结尾。

5. int I = 33/4

I的值为8,整型除以整型数据还是整型。

6. "= ="和"="的区别?

“= =”是等号,“=”是赋值。

7. &&和&, ||和|

&&是逻辑与,&是位与。

   ||是逻辑或,|是位或。

8. 位运算能对浮点型和双精度型变量操作吗?

不能!位运算只针对整型数据。

9. 数据类型转换,能不能改变变量的数据类型和值?

不改变,只是进行类型转换,不改变变量本身的类型和值。

10. 强制类型转换用括号()

猜你喜欢

转载自blog.csdn.net/weixin_40583722/article/details/80821944