每日一个C语言知识:C 输入 输出
C 语言输入 & 输出
C语言本身不提供输入输出语句,而是通过标准库函数来实现。这些函数主要在 <stdio.h> 头文件中声明。
基本的输出函数
1. printf() - 格式化输出
这是最常用的输出函数,可以将数据按指定格式输出到标准输出设备(通常是屏幕)。
语法:
int printf(const char *format, ...);
示例:
#include <stdio.h>int main() {int age = 25;float salary = 7500.50;char name[] = "张三";// 基本输出printf("Hello, World!\n");// 格式化输出printf("姓名: %s\n", name); // 字符串printf("年龄: %d\n", age); // 整数printf("工资: %.2f\n", salary); // 浮点数,保留2位小数printf("字符: %c\n", 'A'); // 字符// 多个变量输出printf("%s今年%d岁,工资%.2f元\n", name, age, salary);return 0;
}
2. putchar() - 输出单个字符
#include <stdio.h>int main() {putchar('A'); // 输出字符 Aputchar('\n'); // 输出换行putchar('B');putchar('\n');return 0;
}
3. puts() - 输出字符串
自动在字符串末尾添加换行符。
#include <stdio.h>int main() {char str[] = "Hello, C Language!";puts(str); // 输出字符串并换行puts("这是另一行"); // 直接输出字符串常量return 0;
}
基本的输入函数
1. scanf() - 格式化输入
从标准输入设备(通常是键盘)读取格式化数据。
语法:
int scanf(const char *format, ...);
示例:
#include <stdio.h>int main() {int age;float height;char name[50];printf("请输入您的姓名: ");scanf("%s", name); // 读取字符串(不包含空格)printf("请输入年龄: ");scanf("%d", &age); // 注意:需要取地址符 &printf("请输入身高(米): ");scanf("%f", &height);printf("\n--- 您的信息 ---\n");printf("姓名: %s\n", name);printf("年龄: %d\n", age);printf("身高: %.2f米\n", height);return 0;
}
重要提醒: 使用 scanf() 读取字符串时,遇到空格会停止。要读取包含空格的字符串,可以使用 fgets()。
2. getchar() - 读取单个字符
#include <stdio.h>int main() {char ch;printf("请输入一个字符: ");ch = getchar(); // 读取单个字符printf("您输入的字符是: ");putchar(ch);putchar('\n');return 0;
}
3. gets() 和 fgets() - 读取字符串
注意: gets() 函数不安全,已从C11标准中移除,因为它不检查缓冲区大小。
推荐使用 fgets():
#include <stdio.h>int main() {char name[50];printf("请输入您的全名: ");fgets(name, sizeof(name), stdin); // 安全地读取字符串printf("您好, %s", name); // fgets会保留换行符return 0;
}
格式化说明符详解
| 格式符 | 用途 | 示例 |
|---|---|---|
%d | 有符号十进制整数 | printf("%d", 100); |
%f | 浮点数 | printf("%.2f", 3.14159); |
%c | 字符 | printf("%c", 'A'); |
%s | 字符串 | printf("%s", "hello"); |
%u | 无符号十进制整数 | printf("%u", 255); |
%x | 十六进制整数(小写) | printf("%x", 255); |
%X | 十六进制整数(大写) | printf("%X", 255); |
%o | 八进制整数 | printf("%o", 64); |
%p | 指针地址 | printf("%p", &var); |
%% | 输出%字符本身 | printf("%%"); |
格式化修饰符:
%.2f- 保留2位小数%5d- 至少占5个字符宽度,右对齐%-5d- 至少占5个字符宽度,左对齐%05d- 至少占5个字符宽度,前面补0
完整的交互式示例
#include <stdio.h>int main() {char name[50];int age;float gpa;char grade;// 获取用户输入printf("=== 学生信息录入 ===\n");printf("请输入姓名: ");fgets(name, sizeof(name), stdin);// 移除fgets读取的换行符for(int i = 0; name[i] != '\0'; i++) {if(name[i] == '\n') {name[i] = '\0';break;}}printf("请输入年龄: ");scanf("%d", &age);printf("请输入平均成绩: ");scanf("%f", &gpa);printf("请输入等级 (A/B/C/D/F): ");scanf(" %c", &grade); // 注意%c前面的空格,用于跳过之前的换行符// 格式化输出printf("\n=== 学生信息汇总 ===\n");printf("姓名: %s\n", name);printf("年龄: %d岁\n", age);printf("平均成绩: %.2f\n", gpa);printf("等级: %c\n", grade);// 表格形式输出printf("\n%-10s %-6s %-8s %s\n", "姓名", "年龄", "成绩", "等级");printf("%-10s %-6d %-8.2f %c\n", name, age, gpa, grade);return 0;
}
文件输入输出
C语言也提供了文件操作函数,语法与标准I/O类似。
文件写入示例:
#include <stdio.h>int main() {FILE *file;char text[] = "这是写入文件的内容\nHello, File I/O!";// 打开文件用于写入file = fopen("example.txt", "w");if(file == NULL) {printf("文件打开失败!\n");return 1;}// 写入文件fprintf(file, "%s\n", text);fputs("这是另一行文本\n", file);// 关闭文件fclose(file);printf("文件写入成功!\n");return 0;
}
文件读取示例:
#include <stdio.h>int main() {FILE *file;char buffer[100];// 打开文件用于读取file = fopen("example.txt", "r");if(file == NULL) {printf("文件打开失败!\n");return 1;}printf("文件内容:\n");printf("==========\n");// 逐行读取文件内容while(fgets(buffer, sizeof(buffer), file) != NULL) {printf("%s", buffer);}// 关闭文件fclose(file);return 0;
}
错误处理和输入验证
良好的输入输出应该包含错误处理:
#include <stdio.h>int main() {int number;char ch;printf("请输入一个整数: ");// 检查scanf是否成功读取if(scanf("%d", &number) != 1) {printf("输入错误!请输入有效的整数。\n");// 清空输入缓冲区while((ch = getchar()) != '\n' && ch != EOF);return 1;}printf("您输入的数是: %d\n", number);// 清空输入缓冲区中的剩余字符while((ch = getchar()) != '\n' && ch != EOF);printf("请输入一个字符: ");scanf("%c", &ch);printf("您输入的字符是: %c\n", ch);return 0;
}
高级格式化技巧
#include <stdio.h>int main() {int num1 = 123, num2 = 4567;float pi = 3.1415926535;printf("=== 格式化输出示例 ===\n");// 宽度和对齐printf("右对齐: |%5d|\n", num1); // | 123|printf("左对齐: |%-5d|\n", num1); // |123 |printf("前导零: |%05d|\n", num1); // |00123|// 浮点数精度printf("默认: %f\n", pi); // 3.141593printf("2位小数: %.2f\n", pi); // 3.14printf("4位小数: %.4f\n", pi); // 3.1416// 科学计数法printf("科学计数法: %e\n", pi); // 3.141593e+00// 十六进制和八进制printf("十进制: %d\n", 255); // 255printf("十六进制: %x\n", 255); // ffprintf("八进制: %o\n", 64); // 100return 0;
}
输入输出重定向
在命令行中,可以使用重定向操作符:
#include <stdio.h>int main() {int number;// 从标准输入读取,可能会被重定向while(scanf("%d", &number) == 1) {printf("读取到: %d\n", number);}return 0;
}
使用方法:
./program < input.txt- 从文件输入./program > output.txt- 输出到文件./program < input.txt > output.txt- 同时重定向输入和输出
