[C.C++] c语言——常用的输出函数

756 0
Honkers 2025-3-7 16:57:01 | 显示全部楼层 |阅读模式

一.printf函数

1. printf的定义:printf函数称为格式输出函数。功能是按照用户指定的格式,把指定的数据输出到屏幕上面。

2. printf函数的基本格式:

3. 格式控制字符串的基本形式可以表示为:

  1. %[flags][width][.precision][length]specifier
复制代码

  • flags:标志位,用于控制输出的格式,如左对齐、右对齐、显示正负号等。可以有零个或多个,常见的标志位包括-(左对齐)、+(显示正负号)、0(用0填充空白)、#(使用备用形式输出)等。
  • width:输出宽度,是一个非负整数,表示输出的最小宽度。如果实际宽度小于指定宽度,则会在左侧(默认为右对齐)或右侧(如果使用了左对齐标志)填充空格或指定的字符(如0)。
  • .precision:精度,用于指定浮点数的小数位数或字符串的最大输出长度。对于浮点数,它指定了小数部分的位数;对于字符串,它指定了最大输出字符数(如果字符串长度超过该值,则会被截断)。
  • length:长度修饰符,用于指定后续参数的数据类型长度,如h(短整型)、l(长整型)、ll(长长整型)等。
  • specifier:转换说明符,用于指定输出数据的类型,如%d(十进制整数)、%f(浮点数)、%s(字符串)等。

printf函数要输出不同类型的字符串,需要不同的格式符。


类型

  • 格式: printf("a = %类型", a);
  • 类型字符串用以表示输出数据的类型, 其格式符和意义如下所示
类型含义
%a(%A)浮点数、十六进制数字和p-(P-)记数法(C99)
%c字符
%f浮点数(包括float和doulbe)
%e(%E)浮点数指数输出[e-(E-)记数法]
%g(%G)浮点数不显无意义的零"0"
%i有符号十进制整数(与%d相同)
%u无符号十进制整数
%o无符号八进制整数 
%x(%X)无符号16进制整型
%p指针
%s

字符串 

%%“%”
  1. #include <stdio.h>
  2. int main(){
  3. int a = 10;
  4. int b = -10;
  5. float c = 6.6f;
  6. double d = 3.1415926;
  7. double e = 10.10;
  8. char f = 'a';
  9. // 有符号整数(可以输出负数)
  10. printf("a = %d\n", a); // 10
  11. printf("a = %i\n", a); // 10
  12. // 无符号整数(不可以输出负数)
  13. printf("a = %u\n", a); // 10
  14. printf("b = %u\n", b); // 429496786
  15. // 无符号八进制整数(不可以输出负数)
  16. printf("a = %o\n", a); // 12
  17. printf("b = %o\n", b); // 37777777766
  18. // 无符号十六进制整数(不可以输出负数)
  19. printf("a = %x\n", a); // a
  20. printf("b = %x\n", b); // fffffff6
  21. // 无符号十六进制整数(不可以输出负数)
  22. printf("a = %X\n", a); // A
  23. printf("b = %X\n", b); // FFFFFFF6
  24. // 单、双精度浮点数(默认保留6位小数)
  25. printf("c = %f\n", c); // 6.600000
  26. printf("d = %lf\n", d); // 3.141593
  27. // 以指数形式输出单、双精度浮点数
  28. printf("e = %e\n", e); // 1.010000e+001
  29. printf("e = %E\n", e); // 1.010000E+001
  30. // 以最短输出宽度,输出单、双精度浮点数
  31. printf("e = %g\n", e); // 10.1
  32. printf("e = %G\n", e); // 10.1
  33. // 输出字符
  34. printf("f = %c\n", f); // a
  35. }
复制代码

宽度:

  • 格式: printf("a = %[宽度]类型", a);
  • 用十进制整数指定输出的宽度,如果实际位数多于指定宽度,则按照实际位数输出, 如果实际位数少于指定宽度则以空格补位
  1. #include <stdio.h>
  2. int main(){
  3. // 实际位数小于指定宽度
  4. int a = 1;
  5. printf("a =|%d|\n", a); // |1|
  6. printf("a =|%5d|\n", a); // | 1|
  7. // 实际位数大于指定宽度
  8. int b = 1234567;
  9. printf("b =|%d|\n", b); // |1234567|
  10. printf("b =|%5d|\n", b); // |1234567|
  11. }
复制代码

  • 标志
    • 格式: printf("a = %[标志][宽度]类型", a);
标志含义
-左对齐, 默认右对齐
+当输出值为正数时,在输出值前面加上一个+号, 默认不显示
0右对齐时, 用0填充宽度.(默认用空格填充)
空格输出值为正数时,在输出值前面加上空格, 为负数时加上负号
#对c、s、d、u类型无影响
#对o类型, 在输出时加前缀o
#对x类型,在输出时加前缀0x
  1. #include <stdio.h>
  2. int main(){
  3. int a = 1;
  4. int b = -1;
  5. // -号标志
  6. printf("a =|%5d|\n", a); // | 1|
  7. printf("a =|%-5d|\n", a);// |1 |
  8. // +号标志
  9. printf("a =|%d|\n", a); // |1|
  10. printf("a =|%+d|\n", a);// |+1|
  11. printf("b =|%d|\n", b); // |-1|
  12. printf("b =|%+d|\n", b);// |-1|
  13. // 0标志
  14. printf("a =|%5d|\n", a); // | 1|
  15. printf("a =|%05d|\n", a); // |00001|
  16. // 空格标志
  17. printf("a =|% d|\n", a); // | 1|
  18. printf("b =|% d|\n", b); // |-1|
  19. // #号
  20. int c = 10;
  21. printf("c = %o\n", c); // 12
  22. printf("c = %#o\n", c); // 012
  23. printf("c = %x\n", c); // a
  24. printf("c = %#x\n", c); // 0xa
  25. }
复制代码

  • 精度
    • 格式: printf("a = %[精度]类型", a);
    • 精度格式符以"."开头, 后面跟上十进制整数, 用于指定需要输出多少位小数, 如果输出位数大于指定的精度, 则删除超出的部分
  1. #include <stdio.h>
  2. int main(){
  3. double a = 3.1415926;
  4. printf("a = %.2f\n", a); // 3.14
  5. }
复制代码
  • 动态指定保留小数位数
    • 格式: printf("a = %.*f", a);
  1. #include <stdio.h>
  2. int main(){
  3. double a = 3.1415926;
  4. printf("a = %.*f", 2, a); // 3.14
  5. }
复制代码
  • 实型(浮点类型)有效位数问题
    • 对于单精度数,使用%f格式符输出时,仅前6~7位是有效数字
    • 对于双精度数,使用%lf格式符输出时,前15~16位是有效数字
    • 有效位数和精度(保留多少位)不同, 有效位数是指从第一个非零数字开始,误差不超过本数位半个单位的、精确可信的数位
    • 有效位数包含小数点前的非零数位
  1. #include <stdio.h>
  2. int main(){
  3. // 1234.567871093750000
  4. float a = 1234.567890123456789;
  5. // 1234.567890123456900
  6. double b = 1234.567890123456789;
  7. printf("a = %.15f\n", a); // 前8位数字是准确的, 后面的都不准确
  8. printf("b = %.15f\n", b); // 前16位数字是准确的, 后面的都不准确
  9. }
复制代码

  • 长度
    • 格式: printf("a = %[长度]类型", a);
长度修饰类型含义
hhd、i、o、u、x输出char
hd、i、o、u、x输出 short int
ld、i、o、u、x输出 long int
lld、i、o、u、x输出 long long int
  1. #include <stdio.h>
  2. int main(){
  3. char a = 'a';
  4. short int b = 123;
  5. int c = 123;
  6. long int d = 123;
  7. long long int e = 123;
  8. printf("a = %hhd\n", a); // 97
  9. printf("b = %hd\n", b); // 123
  10. printf("c = %d\n", c); // 123
  11. printf("d = %ld\n", d); // 123
  12. printf("e = %lld\n", e); // 123
  13. }
复制代码

  • 转义字符
    • 格式: printf("%f%%", 3.1415);
    • %号在格式控制字符串中有特殊含义, 所以想输出%必须添加一个转移字符
  1. #include <stdio.h>
  2. int main(){
  3. printf("%f%%", 3.1415); // 输出结果3.1415%
  4. }
复制代码

多种语言的对比

· C语言

  1. #include<stdio.h>
  2. int main() {
  3. printf("HALLO WORLD");
  4. return 0;
  5. }
复制代码

· C++语言

  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. cout << "HALLOW WARLD" << endl;
  5. return 0;
  6. }
复制代码

二.scanf函数

1.scanf的定义:scanf函数是用于接收键盘输入的内容。是一个阻塞式函数,程序会停在scanf函数出现的地方,直到接收到数据才会执行到后面的代码

2. scanf的基本形式:

  • scanf("格式控制字符串", 地址列表);
  • 例如: scanf("%d", &num);
  • 基本用法
    • 地址列表项中只能传入变量地址, 变量地址可以通过&符号+变量名称的形式获取
  1. #include <stdio.h>
  2. int main(){
  3. int number;
  4. scanf("%d", &number); // 接收一个整数
  5. printf("number = %d\n", number);
  6. }
复制代码

 注意点

  • 接收非字符和字符串类型时, 空格、Tab和回车会被忽略
  1. #include <stdio.h>
  2. int main(){
  3. float num;
  4. // 例如:输入 Tab 空格 回车 回车 Tab 空格 3.14 , 得到的结果还是3.14
  5. scanf("%f", &num);
  6. printf("num = %f\n", num);
  7. }
复制代码
  • 非格式字符串原样输入, 格式控制字符串会赋值给地址项列表项中的变量
  1. #include <stdio.h>
  2. int main(){
  3. int number;
  4. // 用户必须输入number = 数字 , 否则会得到一个意外的值
  5. scanf("number = %d", &number);
  6. printf("number = %d\n", number);
  7. }
复制代码
  • 接收多条数据
    • 格式控制字符串和地址列表项在数量和类型上必须一一对应
    • 非字符和字符串情况下如果没有指定多条数据的分隔符, 可以使用空格或者回车作为分隔符(不推荐这种写法)
    • 非字符和字符串情况下建议明确指定多条数据之间分隔符
  1. #include <stdio.h>
  2. int main(){
  3. int number;
  4. scanf("%d", &number);
  5. printf("number = %d\n", number);
  6. int value;
  7. scanf("%d", &value);
  8. printf("value = %d\n", value);
  9. }
  10. #include <stdio.h>
  11. int main(){
  12. int number;
  13. int value;
  14. // 可以输入 数字 空格 数字, 或者 数字 回车 数字
  15. scanf("%d%d", &number, &value);
  16. printf("number = %d\n", number);
  17. printf("value = %d\n", value);
  18. }
  19. #include <stdio.h>
  20. int main(){
  21. int number;
  22. int value;
  23. // 输入 数字,数字 即可
  24. scanf("%d,%d", &number, &value);
  25. printf("number = %d\n", number);
  26. printf("value = %d\n", value);
  27. }
复制代码
  • \n是scanf函数的结束符号, 所以格式化字符串中不能出现\n
  1. #include <stdio.h>
  2. int main(){
  3. int number;
  4. // 输入完毕之后按下回车无法结束输入
  5. scanf("%d\n", &number);
  6. printf("number = %d\n", number);
  7. }
复制代码

3. scanf运行原理

  • 系统会将用户输入的内容先放入输入缓冲区
  • scanf方式会从输入缓冲区中逐个取出内容赋值给变量
  • 如果输入缓冲区的内容不为空,scanf会一直从缓冲区中获取,而不要求再次输入

 

三.putchar函数

  • putchar: 向屏幕输出一个字符
  1. #include <stdio.h>
  2. int main(){
  3. char ch = 'a';
  4. putchar(ch); // 输出a
  5. }
复制代码

四.getchar函数

  • getchar: 从键盘获得一个字符
  1. #include <stdio.h>
  2. int main(){
  3. char ch;
  4. ch = getchar();// 获取一个字符
  5. printf("ch = %c\n", ch);
  6. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

荣誉红客

关注
  • 4008
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行