首页 > 其他分享 >C:02---scanf、printf

C:02---scanf、printf

时间:2022-11-01 14:37:39浏览次数:60  
标签:02 scanf 打印 --- 读入 printf 空白符 输入

一、printf​

控制符

  • ①精度控制:输入小数点后m位(%.mf)。右对齐5位,保留小数点后m位(%d.mf)%f、%lf默认输出6位小数
  • ②宽度:%md(打印m为,右对齐,多出m位照常打印)。%-md(打印m位,左对齐,多出m位照常打印)
  • ③长度:h表示短(打印短整型short:%hd),l表示长(打印长整型long:%ld)
  • ④标记(#:%#0输出八进制,%#x输出十六进制)(0:对齐中空白处用0补齐(%010d))

自己控制输出位

  • printf("%*d",3,2);  //打印2,向右对齐3位
  • printf("%-*d",3,2);  //打印2,向左对齐3位

返回值

  • 输出正确:返回打印的字符串的长度(包括空白符、换行符等)
  • 输出出错:返回负数(如果不用变量接收错误的printf,程序就会出错。如果用变量去接收错误printf,程序就不会出错)

 你以为你输出了helloworld就掌握了printf,来,我接着带你重新认识printf,我这个人比较爱刚代码,来看第一个代码:

 

#include <stdio.h>
int main(){
char a = 'a';
int b = 2;
printf("%d\n",a,b = b+1);
printf("b is: %d\n",b);
return 0;
}

首先不要惊讶这个代码怎么会这么写,第五行是不是少写了个%d, 你认为输出是什么:是’a‘对应的整型数值 97呢还是数值2?  

实际上从printf的使用情况来看,我们不难发现一个规律,就是无论其可变的参数有多少个,printf的第一个参数总是一个字符串。

而正是这第一个参数,使得它可以确认后面还有有多少个参数尾随。

而尾随的每个参数占用的栈空间大小又是通过第一个格式字符串确定的。

然而printf到底是怎样取第一个参数后面的可变的参数值的呢, 实际上可变参数函数的实现与函数调用的栈结构有关,正常情况下c/c++的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈。

所以,你觉得你真的掌握了printf函数吗?

二、scanf​

  •  
  • scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。
  • 其调用格式为:      scanf("<格式化字符串>",<地址表>);
  • scanf()函数返回成功赋值的数据项数,出错时则返回EOF。
  • 其控制串由三类字符构成:
  • 1。格式化说明符;
    2。空白符;
    3。非空白符;
  • (A)                格式化说明符
  • 格式字符           说明
  • %a                 读入一个浮点值(仅C99有效) 
    %A                 同上
    %c                 读入一个字符
    %d                 读入十进制整数
    %i                 读入十进制,八进制,十六进制整数
    %o                 读入八进制整数
    %x                 读入十六进制整数
    %X                 同上
    %c                 读入一个字符
    %s                 读入一个字符串
    %f                 读入一个浮点数
    %F                 同上
    %e                 同上
    %E                 同上
    %g                 同上
    %G                 同上
    %p                 读入一个指针
    %u                 读入一个无符号十进制整数
    %n                 至此已读入值的等价字符数
    %[]                扫描字符集合
    %%                 读%符号
                    
    附加格式说明字符表
  • 修饰符                       说明
  • L/l 长度修饰符               输入"长"数据
    h 长度修饰符                 输入"短"数据
    W 整型常数                   指定输入数据所占宽度
    * 星号                       空读一个数据 
    hh,ll同上h,l但仅对C99有效。
  •  
  • 如果你认为就这么简单的一个输入函数匆匆了事,那你可能会写出bug,不信你看如下代码: 
#include <stdio.h> 
int main()
{
int a;
printf( "input the data\n ");
scanf( "%d\n ",&a);//这里多了一个回车符/n
printf( "%d ",a);
return 0;
}

结果要输入两个数程序才结束,而不是预期的一个。why? 
原因:用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括 

空格,制表符,换行符,回车符和换页符。所以如果你用scanf( "%d ",&a)也会出现同样的问题。 
解决方法:这种错误大多是输入的时候不小心,多注意一点就好了。这种问题也不好检查,编译没有问题  

标签:02,scanf,打印,---,读入,printf,空白符,输入
From: https://blog.51cto.com/u_14934686/5813611

相关文章

  • C++:17---sizeof运算符
    功能:以字节位单位,返回一个表达式或一个数据类型所占的字节数返回值类型:是size_t类型sizeof有无括号:sizeof不加括号,后面不可以直接跟数据类型sizeof加括号,后面既可以跟表达式......
  • Redis:10---List对象
    ​一、列表对象概述   列表类型是用来存储多个有序的字符串,一个列表最多可以存储多个元素。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有......
  • C++:44---关键字virtual、override、final
    一、虚函数概念:在函数前面加virtual,就是虚函数虚函数的一些概念:只有成员函数才可定义为虚函数,友元/全局/static/构造函数都不可以虚函数需要在函数名前加上关键字virtual成......
  • C++:45---多态
    一、多态介绍面向对象的核心思想是多态性,其含义是“多种形式”概念:在子类覆盖了父类函数的情况下,用父类的指针(或引用)调用子类对象,或者通过父类指针调用覆盖函数的时候(动......
  • C++(STL):26 ---关联式容器set用法
    set容器都会自行根据键的大小对存储的键值对进行排序,只不过set容器中各键值对的键key和值value是相等的,根据key排序,也就等价为根据value排序。另外,使用set容器......
  • 怎么查小河流名称--河流数据库
    全国最大的河流名称数据库,没有你找不到的当一条河流自上而下不同河段有不同的名称时,一般以下游的河名作为整个河流的名称。当河流在地形图上没有标注名称时,可采用下列方法......
  • C++(STL):06---数值的极值(numeric_limits类)
    一、数值的极值概述数值类型有着与平台相依的极值C++标准规定了各种类型必须保证的最小精度。这些最小值如下图所示: 类型最小长度char1byte(8bits)shortint2bytesint2bytes......
  • C++:51---继承中的构造函数、析构函数、拷贝控制一系列规则
    一、继承中的构造函数根据构造函数的执行流程我们知道:派生类定义时,先执行基类的构造函数,再执行派生类的构造函数拷贝构造函数与上面是相同的原理二、继承中的析构函数根据析......
  • C++:46---绝不重新定义继承而来的non-virtual函数
    一、看一个隐藏non-virtual函数的例子假设classD以public的方式继承于classB,代码如下:classB{public:voidmf();};classD:publicB{};intmain(){Dx;B*pB=&x;pB->......
  • 动态规划-回文串
    回文串是从左到右和从右到左读起来一样的字符串,变种还有回文子序列,区别就是字符可以不连续。求回文串个数、最长回文串、最长回文序列也是典型的二维动态规划问题。我们......