printf()函数和scanf()函数

一、printf函数
printf 的格式
printf 的格式有四种:
(1) printf("字符串\n");

int main(void)
{
printf("Hello World!\n"); // \n
(2) printf("输出控制符",输出参数);

int main(void)
{
int i = 10;
printf("%d\n", i); /%d是输出控制符,d 表示十进制,后面的 i 是输出参数/
return 0;
}
这句话的意思是将变量 i 以十进制输出。
(3) printf("输出控制符1 输出控制符2…", 输出参数1, 输出参数2, …);

int main(void)
{
int i = 10;
int j = 3;
printf("%d %d\n", i, j);
return 0;
}
输出控制符 1 对应的是输出参数 1,输出控制符 2 对应的是输出参数 2……编译、链接、执行后我们看一下输出结果:
10 3
上面 %d 和 %d之间有空格,所以10 3之间有空格。printf 中双引号内除了输出控制符和转义字符\n外,所有其余的普通字符全部都原样输出。比如:

int main(void)
{
int i = 10;
int j = 3;
printf("i = %d, j = %d\n", i, j);
return 0;
}
这时我们再编译、链接、执行一下:
i = 10, j = 3
i=、,、空格和j=全都原样输出了。此外需要注意的是:“输出控制符”和“输出参数”无论在“顺序上”还是在“个数上”一定要一一对应。
(4) printf("输出控制符 非输出控制符",输出参数);
二、一、使用printf函数注意事项
1、域宽问题
(1)%d:按整型数据的实际长度输出。 如果想输出指定宽度可以指定域宽
(2)%md-->m域宽,打印出来以后,在控制台上,显示m位。
如果我们要打印的数的位数如果超过我们设定 m 则原样输出
如果我们要打印的数的位数如果小于我们设定的位数,则补空白,具体如下:
如果m为正数,则左对齐(左侧补空白)
如果m为负数,则右对齐(右侧补空白)
// 如果m为负数,则右对齐(右侧补空白)
printf("|%-5d|",88);
输出结果:|88 |
// 如果m为正数,则左对齐(左侧补空白)
printf("|%5d|",88);
输出结果:| 88|
// %0md 表示,位数不足部分补“0”
printf("|%05d|",88);
输出结果:|00088|
常用于日期, 图片处理等
2.转义字符问题
(1)如果想输出字符"%",则应该在“格式控制”字符串中用连续两个%表示
printf("%f%%", 1.0/3);
输出结果: 0.333333%。
(2)转义字符
转义字符 意义
\n 换行,相当于敲一下回车
\t 跳到下一个tab位置,相当于按一下键盘上的tab键
\b 相当于按一下backspace。
\r 使光标回到本行开头。
\f 换页,光标移到到下页开头
\ 输出\字符,也就是在屏幕上显示一个\字符
' 输出'字符,也就是在屏幕上显示一个'字符
'' 输出"字符,也就是在屏幕上显示一个"字符

三、scanf函数
1.scanf函数输出格式
(1) scanf("输入控制符", 输入参数);
功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。
例如

include <stdio.h>

int main(void)
{
int i;
i = 10;
printf("i = %d\n", i);
return 0;
}
(2) scanf("输入控制符非输入控制符", 输入参数);
这种用法几乎是不用的。那为什么 printf 中可以有“非输出控制符”,而 scanf 中就不可以有“非输入控制符”。事实上不是不可以有,而是没有必要!例如:

int main(void)

{
int i;
scanf("i = %d", &i);
printf("i = %d\n", i);
return 0;
}
2.注意点
在 printf 中,所有的“非输出控制符”都要原样输出。同样,在 scanf 中,所有的“非输入控制符”都要原样输入。所以在输入的时候i=必须要原样输入。比如要从键盘给变量 i 赋值 123,那么必须要输入i=123才正确,少一个都不行,否则就是错误。所以 scanf 中%d后面也没有必要加\n,因为在 scanf 中\n不起换行的作用。它不但什么作用都没有,你还要原样将它输入一遍。所以在 scanf 的使用中一定要记住:双引号内永远都不要加“非输入控制符”。除了“输入控制符”之外,什么都不要加,否则就是自找麻烦。而且对于用户而言,肯定是输入越简单越好。
要想将程序中的 scanf 行弄明白,首先要清楚的是:我们从键盘输入的全部都是字符。比如从键盘输入 123,它表示的并不是数字 123,而是字符 '1'、字符 '2' 和字符 '3'。
操作系统内核就是这样运作的。操作系统在接收键盘数据时都将它当成字符来接收的。这时就需要用“输入控制符”将它转化一下。%d的含义就是要将从键盘输入的这些合法的字符转化成一个十进制数字。经过 %d 转化完之后,字符 123 就是数字 123 了。
3.取地址运算符&
&是一个取地址运算符,&后面加变量名表示“该变量的地址”,所以&i就表示变量 i 的地址。&i又称为“取地址i”,就相当于将数据存入以变量 i 的地址为地址的变量中。
那么以变量 i 的地址为地址的变量是哪个变量呢?就是变量 i。所以程序中 scanf 的结果就把值 123 放到变量i中。

综上所述,scanf 语句的意思就是:从键盘上输入字符 123,然后%d将这三个字符转化成十进制数 123,最后通过“取地址 i”找到变量 i 的地址,再将数字 123 放到以变量 i 的地址为地址的变量中,即变量 i 中,所以最终的输出结果就是i=123。
四、使用scanf函数注意事项
1.scanf函数说明:
(1)如果使用这个函数,要包含一个头文件 stdio.h。
(2)scanf函数是一个阻塞式函数:函数执行后,会等待用户的输入,如果用户不输入任何内容,它会一直等待。
2.scanf函数的作用:
接收用户从键盘输入的内容。
3.scanf函数的格式:
scanf("格式控制符",输入项的地址列表);
例如:scanf("%d",&a); 其中a是一个变量
4.scanf函数使用注意事项
(1)如果在输入时,输入了多个空格、回车、Tab都会被系统忽略的。
(2)如果要获取的内容是多个整数,中间输入了多个空格、回车、Tab都会被系统忽略特别注意:当输入是一个字符串时,输入字符串时不能在中间输入空格、回车、Tab,否则之后的字符都不会被输入。
5.scanf函数运行原理:
(1)当用户输入内容后,用户输入的内容会被存放到scanf的输入缓冲区中,然后scanf函数会根据格式控制的字符的要求,从输入缓冲区一次取它想要的内容,如果从缓冲区中取的内容和我们的格式要求一致,则把值存放到变量中如果格式不一致,则不修改变量的值。
(2)如果缓冲区中有内容,则不会提示我们再输入值。
6.关于scanf函数的总结:
(1)如果我们的输入全都是%d类型的,那么无论我们在输入数据时时插入 空格、回车、Tab等其他字符,都会被系统忽略。
(2)如果我们输入的是类型中含有%c类型等混合输入,那么就不能随便的插入 空格、回车、Tab等其他字符,要按照scanf函数的格式来从键盘输入。
例如:
scanf("%d%c%d",&a,&ch&b);
从键盘输入的格式如下:
21a34(回车)
小结:所以一般在混合的scanf函数书写时最好使用如下格式:这样不仅安全而且我们输入时也清楚明了。
建议格式:scanf("%d,%c,%d",&a,&ch,&b);
从键盘输入的格式:21,a,34
总之在输入时,一定按照scanf的“格式控制符”的格式一一输入。

上一篇:为docker配置HTTP代理服务器


下一篇:格式化输入输出