4. printf(), scanf()

printf() 函数定义在头文件 <stdio.h> 中,用于将格式化的数据输出到控制台(终端)。


一、基本格式

#include <stdio.h>

int main() {
    printf("格式控制字符串", 输出列表);
    return 0;
}
  • 格式控制字符串:包含普通字符和格式说明符
  • 输出列表:与格式说明符一一对应的变量或表达式。

二、常用格式说明符(Format Specifiers)

格式符类型示例
%d十进制有符号整数int
%u十进制无符号整数unsigned int
%ld长整型(long)long
%lld长长整型(long long)long long
%f浮点数(float/double)floatdouble
%c字符char
%s字符串"Hello"
%x十六进制小写输出unsigned int
%X十六进制大写输出unsigned int
%o八进制输出unsigned int
%p指针地址&variable
%%输出一个 % 符号

三、格式化输出示例

1. 基本数据类型输出

#include <stdio.h>

int main() {
    int a = 10;
    float b = 3.14159;
    char c = 'A';
    char str[] = "Hello, World!";

    printf("整数: %d\n", a);
    printf("浮点数: %f\n", b);
    printf("字符: %c\n", c);
    printf("字符串: %s\n", str);

    return 0;
}

输出:

整数: 10
浮点数: 3.141590
字符: A
字符串: Hello, World!

2. 控制小数位数(浮点数)

printf("保留2位小数: %.2f\n", b);  // 输出 3.14

3. 控制宽度(对齐)

printf("占10位宽度: %10d\n", a);   // 输出 "      10"
printf("占10位宽度左对齐: %-10d\n", a); // 输出 "10      "

4. 输出十六进制、八进制

int num = 255;

printf("十六进制小写: %x\n", num); // 输出 ff
printf("十六进制大写: %X\n", num); // 输出 FF
printf("八进制: %o\n", num);       // 输出 377

5. 输出地址

int x = 10;
printf("变量x的地址: %p\n", &x);  // 输出类似 0x7fff5fbff5ac

四、格式化字符串修饰符(可选)

你可以通过在格式符前添加修饰符来更精确地控制输出格式:

修饰符含义
l用于 long 或 double
ll用于 long long
h用于 short
z用于 size_t
.控制小数位数
数字控制最小输出宽度
-左对齐
0用0填充空格

示例:

long long big = 1234567890123LL;
printf("长整型: %lld\n", big);

double d = 123.456789;
printf("宽度10,保留2位小数: %10.2f\n", d);  // 输出 "     123.46"

五、注意事项

  1. 格式符与变量类型必须匹配,否则可能导致未定义行为。
  2. 使用 scanf() 输入时,格式符与变量类型也必须匹配,并且要加 &(除数组)。
  3. printf() 不会自动换行,需手动添加 \n
  4. 对于字符串输出,%s 会自动输出到 \0 为止。

六、完整示例程序

#include <stdio.h>

int main() {
    int age = 25;
    float height = 175.5;
    char initial = 'J';
    char name[] = "John";

    printf("姓名: %s\n", name);
    printf("首字母: %c\n", initial);
    printf("年龄: %d 岁\n", age);
    printf("身高: %.1f cm\n", height);
    printf("十六进制年龄: %x\n", age);
    printf("地址: %p\n", &age);

    return 0;
}

姓名: John
首字母: J
年龄: 25 岁
身高: 175.5 cm
十六进制年龄: 19
地址: 0x7ffee4b59a7c

七、总结

功能函数/格式符
格式化输出printf()
整数输出%d
浮点数输出%f%.2f
字符输出%c
字符串输出%s
地址输出%p
十六进制输出%x / %X
八进制输出%o
控制宽度/精度%10.2f
左对齐%-10d

八、scanf() 函数用于从标准输入(通常是键盘)读取格式化输入,并根据指定的格式符将输入值存储到对应的变量中。它是 <stdio.h> 头文件中的标准函数,常用于用户交互。 

读取整数、浮点数、字符、字符串

#include <stdio.h>

int main() {
    int age;
    float height;
    char initial;
    char name[50];

    printf("请输入你的姓名: ");
    scanf("%s", name);  // 读取字符串(不带空格)

    printf("请输入你的年龄: ");
    scanf("%d", &age);

    printf("请输入你的身高: ");
    scanf("%f", &height);

    printf("请输入你的首字母: ");
    scanf(" %c", &initial);  // 注意前面的空格,防止缓冲区残留

    printf("姓名: %s\n", name);
    printf("年龄: %d\n", age);
    printf("身高: %.2f\n", height);
    printf("首字母: %c\n", initial);

    return 0;
}

注意事项

1. 必须使用 & 运算符

  • scanf() 需要变量的地址来存储输入值。
  • 数组名 不需要加 &,因为数组名本身表示地址。
int a;
scanf("%d", &a);  // 正确

2. 字符串输入只读取到空格为止

  • %s 只读取第一个单词,遇到空格、换行、Tab 会停止。
char name[100];
scanf("%s", name);  // 输入 "John Doe",只会读取 "John"

如需读取整行,可以使用 fgets()

3. 跳过空白字符

  • scanf() 默认会跳过前导空白字符(空格、换行、Tab)。
  • 例外是 %c,它会读取包括空格在内的字符。
char c;
scanf("%c", &c);  // 会读取换行符或空格

建议在 %c 前加空格来跳过前面的空白:

scanf(" %c", &c);  // 跳过前面的空白

4. 避免缓冲区残留

  • 多次 scanf() 可能会因为缓冲区残留导致错误。
  • 可以在输入后使用 getchar() 清除换行符:
scanf("%d", &age);
getchar();  // 清除换行符

或者使用更安全的方式:

while (getchar() != '\n');  // 清空缓冲区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

chxii

小小打赏,大大鼓励!

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

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

打赏作者

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

抵扣说明:

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

余额充值