【C语言笔记】04.格式化输入输出、字符串简介

系列文件git地址:https://gitee.com/HappyTeemo/my_c_test

先看例子:

#include <stdio.h>
#include <string.h>      // 提供 strlen() 原型
#define DENSITY 62.4     // 人体密度
int main()
{
    float weight, volume;
    int size, letters;
    char name[40];        // name 是一个可以容纳40个字符的数组
    
    printf("Hi! What's your first name?\n");
    scanf("%s", name);     //用数组存储字符串
    printf("%s, what's your weight in pounds?\n", name);
    scanf("%f", &weight);  // &weight 和 name 都是地址
    size = sizeof name;
    letters = strlen(name);  // strlen给出字符串中字符长度。‘\n’不算在内。sizeof会算。
    volume = weight / DENSITY;
    printf("Well, %s, your volume is %2.2f cubic feet.\n",
           name, volume);
    printf("Also, your first name has %d letters,\n",
           letters);
    printf("and we have %d bytes to store it.\n", size);
    
    return 0;
}

C语言的格式化输入输出靠的是printf和scanf函数,在stdio.h头文件。

格式化输出:

Printf具有返回值,值为本次调用字符的个数,包括回车等控制符。
看一种使用方式:int i =5; Printf("%d",i);就是将整型变量i替换到字符串中,输出的结果也就是5。理所当然地,还可以Printf("%d,%d,%d,%d",i1,i2,i3,i4);前面的%d称为占位符,就是这个位置是为后面的i留着的,前面占了多少个位置,后面就必须有多少个变量,一个萝卜一个坑。

%d - 0 m.n |或者h 格式字符
//%转换说明的开始(占位符)
//-表示左对齐,默认是右对齐。
//0表示空位填0,省略则空位不填。
//m.n : m是域宽,指对应的输出项在输出设备占用多少个字符的宽度。n是精度,输出浮点数的时候,小数点后面的位数,默认是6。
//l或者h :l整数,long;浮点数,double。h将整数的格式修整为short。

常用例子:

Printf("%d\n",7);
Printf("%4d\n",7);//数字占四个位置
Printf("%-4d\n",7);//-表示数字左对齐
Printf("%04d\n",7);//没有占满的位置用0
Printf("%d,%c\n",'a','a');//字符类型数据%c,字符用ASCLL码表存储,%c的时候编译器会去查表。%d则直接输出数字。
Printf("%f\n",1.5f);//浮点类型数据用%f
Printf("%5.2\n",1.5f);//一共占五个位置,小数点占后两位
Printf("%lf\n",1.5);//双精度浮点数用%lf表示
printf("整型:%i\n浮点型:%f\n符号:%c\n",123,45.6,'$');
printf("十六进制%x, 八进制%o\n", 763, 763);
printf("float/double去掉了尾随的0:%g\n",45.6);

格式字符:

    %c和%hhd: char
    %c和%hhu: unsigned char                                         
    %c对应字符身份,%hhd和%hhu对应数字身份
    %hd       short
    %hu       unsigned short
    %hx:      以16进制的 输出short类型的整数
    %i/%d:    int
    %u:       unsigned int
    %ld       long
    %lu       unsigned long
    %x/%o:    十六进制/八进制
	%#x/%#o:  显示各进制数前缀
    %f/%lf:   float/double
    %g/%lg:   float/double去掉了尾随的0
    %s:       "string"
    %p:       address
    %e:       指数形式,科学计数法 
    %nd也可以作为占位符打印整数数字,n是一个整数。打印结果一定占n个位置,空位置补充空格字符
    %-nd打印结果也占n个位置,空位置出现在右边
    %0nd打印结果也占n个位置,空位置用字符‘0’填充
    %n.mf可以用来打印浮点数,打印结果中整个数字占n个位置,小数点后面占m个位置

标准输出宽度占13位,小数点前一位(非零),小数点占一位,6位小数,e占一位,指数符号占一位,指数占三位。
分隔符:空格,Tab, 回车。

格式化输入scanf:

scanf函数可以从键盘上读取用户输入的内容并把它记录到变量中。它需要变量的地址作为参数。忘记&操作符即发生段错误(程序段、数据段、bss段、堆栈、访问非法地址)。
如果用scanf读取字符串到字符数组中,则不加&

Scanf("%d",&i);

后面跟地址,不能用变量名。

如果输入字母,则不知道怎么办,就不读了。而且一次输入错了如果不处理则后面的输入都无效。

‘*’ : 输入抑制字符,表示该格式说明要求输入数据,但不赋值,即在地址列表中没有相应的地址项
Scanf(“%3d%*5d%f”,&a,&x);
输入2001200 4.1
则200赋给a,4.1赋给x,1200被跳过不赋给任何变量

  • scanf寻找数据的起始地址时,会跳过空白符(空格,回车,制表符等)。
  • scanf不会读取最后的换行符,解决办法:scanf("%*c");//可以将回车从缓冲区读取出来。
  • Width:宽度指示符,表示该输入数据所占列数,系统将自动按它截取所需数据。如遇空格或不可转换的字符,读入的字符将减少
  • 有分隔符时,输入时需要输入对应的符号。
	int age;
	float assets;
	char pet[30];
	printf("Enter your age, assets, and favorite pet.\n");
	scanf("%d %f", &age, &assets);
	// 这里要使用&
	scanf("%s", pet);
	// 字符数组不使用&
	printf("%d $%.2f %s\n", age, assets, pet);

%i和%d的区别:
在printf里面没区别
在scanf里面:%d只匹配十进制,%i匹配八进制,十进制,十六进制。

缓冲区

缓冲区分为:
完全缓冲:填满刷新缓冲区,发送内容。常用于文件。大小取决于系统。
行缓冲:遇到换行符刷新。常用于键盘输入,Enter。
无缓冲:有些系统输入立即输出。

输入缓冲区:
只有当其中的数据读走的时候,才会清除这个数据。
scanf(数据类型)和缓冲区中的数据类型不一致的时候,便无法读走数据,可能导致死循环。
解决办法:
scanf("%*[^\n]");
*忽略读到的内容,[^\n]任何非\n的字符。
scanf调用失败返回0。

输出缓冲区:
程序->输出缓冲区->屏幕
<1>\n
<2>程序结束
<3>输出缓冲区满(4kb)
<4>人工刷新(fflush)

例子代码:

#include <Windows.h>
#include <stdio.h>


int main()
{
	double d = 1.5e30;
	printf("整型:%i\n浮点型:%f\n符号:%c\n",123,45.6,'$');
	printf("十六进制%x, 八进制%o\n", 763, 763);
	printf("float/double去掉了尾随的0:%g\n",45.6);
	printf("**************\n\n");
	/指数//
	printf("d as double:%g\n", d);
	printf("d as integer:%d\n", d);
	printf("d as e:%e\n",d);

	//类型转换/
	printf("**************\n\n");
	printf("%d\n", (int)d);
	printf("\n****************************************\n\n");

	///scanf//
	int age;
	float assets;
	char pet[30];
	printf("Enter your age, assets, and favorite pet.\n");
	scanf("%d %f", &age, &assets);
	// 这里要使用&
	scanf("%s", pet);
	// 字符数组不使用&
	printf("%d $%.2f %s\n", age, assets, pet);
	printf("\n****************************************\n\n");

	printf
	printf("%d\n",7);
	printf("%4d\n",7);//数字占四个位置
	printf("%-4d\n",7);//-表示数字左对齐
	printf("%04d\n",7);//没有占满的位置用0
	printf("%d,%c\n",'a','a');//字符类型数据%c,字符用ASCLL码表存储,%c的时候编译器会去查表。%d则直接输出数字。
	printf("%f\n",1.5f);//浮点类型数据用%f
	printf("%5.2\n",1.5f);//一共占五个位置,小数点占后两位
	printf("%lf\n",1.5);//双精度浮点数用%lf表示



	system("pause");
	return 0;
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐的提千万

江山父老能容我,不使人间造孽钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值