输入输出处理

对应教学日历:讲次 3(3月19日)


一、printf 格式化输出

printf("格式控制字符串", 参数1, 参数2, ...);

常用格式符

格式符含义示例
%d十进制有符号整数printf("%d", 100)100
%o八进制无符号整数printf("%o", 10)12
%x / %X十六进制无符号整数printf("%x", 255)ff
%u十进制无符号整数
%f小数形式浮点数printf("%f", 3.14)3.140000(默认6位)
%e / %E指数形式浮点数printf("%e", 3.14)3.140000e+00
%c单个字符printf("%c", 'A')A
%s字符串printf("%s", "hello")hello
%%输出百分号本身printf("%%")%
%p输出指针地址

格式修饰符

printf("%8d",   42);   // "      42"  宽度8,默认右对齐
printf("%-8d",  42);   // "42      "  宽度8,左对齐(-号)
printf("%08d",  42);   // "00000042"  宽度8,左侧用0填充
printf("%.2f",  3.1415); // "3.14"    保留2位小数
printf("%8.2f", 3.1415); // "    3.14" 宽度8+2位小数

格式修饰符总结

修饰符含义示例
m最小输出宽度%8d
-左对齐(默认右对齐)%-8d
0左侧用0填充%08d
.n小数位数(浮点);字符串截取字符数%.2f
l长整型/双精度%ld %lf

二、scanf 格式化输入

scanf("格式控制字符串", &变量1, &变量2, ...);

重要scanf 的变量前必须加 &(取地址符号),除非是指针或数组名!

常用格式符(与 printf 基本相同但有区别)

格式符含义注意
%d输入整数对应 int
%f输入单精度浮点数对应 float
%lf输入双精度浮点数对应 double不是 %f
%c输入单个字符会读入空格和换行
%s输入字符串遇空格/Tab/换行即停止

scanf 常见问题

  1. 忘记 &

    int a;
    scanf("%d", a);    // 错误!
    scanf("%d", &a);   // 正确
  2. %c 会读入换行符

    scanf("%d", &n);
    scanf("%c", &ch);   // ch 可能读到了上次留下的 '\n'!
    // 解决方法:scanf(" %c", &ch); (在%c前加空格)
  3. %s 不能读取含空格的字符串

    scanf("%s", str);   // 输入 "hello world",只读到 "hello"
    // 应使用 gets() 或 fgets() 读取带空格字符串
  4. 格式控制字符串中除格式符外的字符需要原样输入

    scanf("%d,%d", &a, &b);  // 必须输入 "3,5"(中间加逗号)
    scanf("%d%d", &a, &b);   // 输入 "3 5" 或 "3\n5"

三、字符专用输入输出

putchar —— 输出单个字符

putchar('A');   // 输出 A
putchar('\n');  // 输出换行
putchar(ch);    // 输出字符变量 ch 的值

getchar —— 输入单个字符

char ch;
ch = getchar();  // 从键盘读取一个字符(包括空格和换行)

getchar() 返回的是 int 类型(可以判断 EOF),但通常直接赋值给 char

四、字符串输入输出

puts —— 输出字符串并自动换行

puts("Hello");    // 输出 Hello 并换行
puts(str);        // 输出字符串变量后自动换行

gets —— 输入一行字符串(包含空格)

char str[80];
gets(str);   // 读取整行(含空格),以换行结束
             // 注意:gets() 不会检查缓冲区大小,不安全

注意:实际编程中用 fgets(str, sizeof(str), stdin) 更安全,但考试通常考察 gets


作业示例

ex1-1:简单输入输出——带除零判断

#include<stdio.h>
int main()
{
    int a,b;
    printf("\n请输入a,b:");
    scanf("%d%d",&a,&b);
    if(b!=0)
        printf("%d/%d=%d\n",a,b,a/b);
    else
        printf("除数不能为0!\n");
    return 0;
}

要点

  • scanf("%d%d",&a,&b) 可以连续输入两个整数(空格或换行分隔)
  • 在输出前应该判断除数是否为 0
  • &a&b& 不能忘记

ex1-3-2:scanf + printf 组合

#include<stdio.h>
#include <windows.h>
int main()
{
    SetConsoleOutputCP(CP_UTF8);
    int age;
    printf("你多大了?\n");
    scanf("%d",&age);
    printf("我 %d 岁。\n",age);
    return 0;
}

要点

  • scanf 等待用户输入,按回车后程序继续
  • printf 中使用 %d 输出变量的值
  • SetConsoleOutputCP(CP_UTF8) 是 Windows 平台解决中文乱码的方法(考试不要求)

ex4-1:getchar/putchar 实现大小写转换

#include<stdio.h>
int main()
{
    char a,b;
    printf("请输入一个大写字母:");
    a=getchar();
    putchar('\n');
    b=a+32;              // 转小写:ASCII 码 +32
    printf("转换后的小写字母为:");
    putchar(b);
    putchar('\n');
    return 0;
}

要点

  • getchar() 读取一个字符(不需要 &,因为赋值给 char 变量时直接是值)
  • 大小写转换:'a' - 'A' = 32
  • putchar() 输出单个字符

ex4-2:scanf 与浮点数计算

#include<stdio.h>
int main()
{
    int height;
    float stdweight;
    printf("男人标准体重计算器:\n");
    printf("请输入身高cm:\n");
    scanf("%d",&height);
    stdweight=(height-100)*0.9;
    printf("标准体重:%.2fkg",stdweight);
    return 0;
}

要点

  • scanf("%d", &height) 输入整数
  • printf("%.2f", stdweight) 输出浮点数,保留 2 位小数
  • floatint 混合运算时,int 自动转为 float

作业重点

  • printf 格式符:%d(int)、%f(float)、%lf(double)、%c(char)、%s(字符串)、%o(八进制)、%x(十六进制)
  • scanf 变量前必须加 &(数组名和指针除外)
  • scanf 输入 double%lf(不是 %f
  • getchar()/putchar() 处理单个字符,不需要格式符
  • %.2f 控制小数位数,%8d 控制输出宽度
  • scanf%c 会读取任何字符(包括空格和换行符)
  • gets() 可读取含空格的字符串但不够安全