Administrator
Administrator
发布于 2024-10-03 / 8 阅读
0
0

基本输入输出

1. 引言

在C语言编程中,输入输出(I/O)操作是与用户或其他程序交互的基本方式。常用的I/O函数主要定义在stdio.h头文件中,包括printfscanfgetsputs等。


2. 标准输出——printf函数

2.1 printf函数简介

printf函数用于将格式化的输出写到标准输出(通常是屏幕)。其基本语法如下:

int printf(const char *format, ...);
  • format:格式控制字符串,指定了输出的格式。
  • ...:可变参数,根据格式控制字符串提供要输出的值。

2.2 常用格式控制符

控制符 说明
%d 十进制整数
%f 浮点数
%c 单个字符
%s 字符串
%u 无符号十进制整数
%x 无符号十六进制整数
%o 无符号八进制整数

2.3 示例

#include <stdio.h>

int main() {
    int age = 25;
    float height = 175.5;
    char grade = 'A';
    char name[] = "张三";

    printf("姓名: %s\n", name);
    printf("年龄: %d\n", age);
    printf("身高: %.1f cm\n", height);
    printf("等级: %c\n", grade);

    return 0;
}

输出:

姓名: 张三
年龄: 25
身高: 175.5 cm
等级: A

3. 标准输入——scanf函数

3.1 scanf函数简介

scanf函数用于从标准输入(通常是键盘)读取格式化输入。其基本语法如下:

int scanf(const char *format, ...);
  • format:格式控制字符串,指定了输入的格式。
  • ...:指向接收输入值的变量的指针。

3.2 注意事项

  • 取地址符&:在传递变量时,需使用取地址符&,字符串除外。
  • 输入缓冲区scanf读取时,会受输入缓冲区影响,需注意换行符和空格的处理。

3.3 示例

#include <stdio.h>

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

    printf("请输入姓名: ");
    scanf("%s", name);

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

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

    printf("\n--- 输入的信息 ---\n");
    printf("姓名: %s\n", name);
    printf("年龄: %d\n", age);
    printf("身高: %.1f cm\n", height);

    return 0;
}

运行示例:

请输入姓名: 李四
请输入年龄: 30
请输入身高(cm): 180.2

--- 输入的信息 ---
姓名: 李四
年龄: 30
身高: 180.2 cm

4. 字符输入输出

4.1 getcharputchar函数

  • int getchar(void);:从标准输入读取一个字符。
  • int putchar(int char);:向标准输出写入一个字符。

示例:

#include <stdio.h>

int main() {
    char ch;

    printf("请输入一个字符: ");
    ch = getchar();

    printf("您输入的字符是: ");
    putchar(ch);
    printf("\n");

    return 0;
}

4.2 getsputs函数(注意:gets已被弃用)

  • char *gets(char *str);:从标准输入读取一行字符串,存入str
  • int puts(const char *str);:将字符串str输出到标准输出,随后输出一个换行符。

**注意:**由于gets函数不安全,可能导致缓冲区溢出,建议使用fgets代替。

使用fgets的示例:

#include <stdio.h>

int main() {
    char str[100];

    printf("请输入一行文本: ");
    fgets(str, sizeof(str), stdin);

    printf("您输入的文本是: ");
    puts(str);

    return 0;
}

5. 格式化输入输出的高级用法

5.1 控制宽度和精度

  • 宽度:指定输出字段的最小宽度。
  • 精度:对于浮点数,指定小数点后的位数;对于字符串,指定最大字符数。

示例:

printf("%10d\n", 123);      // 输出字段宽度为10
printf("%.2f\n", 3.14159);  // 保留2位小数
printf("%10.2f\n", 3.14159);// 字段宽度为10,保留2位小数

5.2 左对齐和右对齐

  • 默认右对齐:在字段宽度内,内容靠右排列。
  • 左对齐:在格式控制符中加入-

示例:

printf("%-10d\n", 123);     // 左对齐,字段宽度为10

6. 常见问题和注意事项

6.1 缓冲区问题

  • scanf遗留的换行符:使用scanf读取字符时,可能会读取到上一次输入遗留的换行符,需要清除输入缓冲区。
  • 解决方法:在读取字符前,使用getchar()清除缓冲区,或者使用scanf(" %c", &ch);,在%c前加空格。

6.2 安全性

  • 避免使用gets函数gets函数不安全,容易导致缓冲区溢出。
  • 使用fgets替代fgets可以指定读取的最大字符数,更安全。

6.3 格式控制符匹配

  • 类型匹配:确保格式控制符与变量类型匹配,否则会导致不可预知的错误。

7. 总结

  • printfscanf是最常用的标准输出和输入函数,需要熟练掌握其用法和格式控制符。
  • 注意输入输出的安全性,尽量使用安全的函数,如fgets
  • 熟悉格式化字符串的高级用法,可以使输出更美观,更符合要求。


评论