C语言输入输出函数主要依赖于标准输入输出库stdio.h。最常用的输入输出函数:
输出函数
printf():向标准输出设备(通常是屏幕)输出格式化的字符串。可以根据指定的格式输出整数、浮点数、字符、字符串等。
puts():输出一个字符串,并在末尾自动添加一个换行符。不接受格式说明符。
putchar():输出单个字符。
输入函数
scanf():从标准输入设备(通常是键盘)读取格式化的输入。可以读取整数、浮点数、字符、字符串等,并根据指定的格式进行解析。
gets()(gets()函数在C11标准中被移除,它可能导致缓冲区溢出):用于从标准输入读取一行文本,直到遇到换行符(换行符会被丢弃),但不包括在存储的字符串中。由于安全问题,建议使用fgets()代替。
fgets():从指定的流中读取一行,直到遇到换行符、文件结束符EOF或已读取了n-1个字符为止,并将读取的字符串(包括换行符)存储在数组中。
getchar():从标准输入读取下一个可用的字符,并将其作为无符号字符(unsigned char)转换为int返回。
使用scanf()时,变量前的&符号,表示取变量的地址。
printf()和scanf()中的格式说明符(如%d、%f、%s等)用于指定如何解释传递给函数的参数。
读取字符串时,fgets()比gets()更安全,它允许指定缓冲区的大小,从而避免缓冲区溢出。
输出换行通常使用\n转义字符。
测试代码1:
#include <stdio.h>
#include <string.h> // 用于strlen函数
int main() {
char name[50];
char ch;
int age;
// printf输出
printf("请输入您的名字:");
// fgets读取一行输入(包括空格,直到换行符或缓冲区满)
fgets(name, sizeof(name), stdin);
// fgets读取的换行符
name[strcspn(name, "\n")] = 0;
// puts输出(自动添加换行符)
puts("您好,");
puts(name);
// printf格式化输出
printf("请输入您的年龄:");
// scanf读取整数
scanf("%d", &age);
// printf和putchar格式化输出
printf("您%d岁了。\n", age);
putchar('\n'); // 输出换行符
// getchar读取单个字符
printf("请按任意键继续...");
ch = getchar(); // 读取一个字符
// getchar()处理缓冲区中的换行符(如果getchar之前读取了输入)
while (getchar() != '\n'); // 消耗直到换行符的所有字符
printf("您按下了 '%c'。\n", ch);
return 0;
}
运行结果如下:
测试代码2:
#include <stdio.h>
int main() {
int decimalInt, octalInt, hexInt, skipInt;
unsigned int unsignedInt;
float floatNum;
double doubleNum;
long double longDoubleNum;
char charVar, str[50];
short shortInt;
long long longLongInt;
// 读取十进制整数
printf("Enter a decimal integer: ");
scanf("%d", &decimalInt);
// 读取八进制整数
printf("Enter an octal integer: ");
scanf("%o", &octalInt);
// 读取十六进制整数
printf("Enter a hexadecimal integer: ");
scanf("%x", &hexInt);
// 读取并忽略一个整数
printf("Enter an integer to skip: ");
scanf("%*d", &skipInt);
// 读取无符号整数
printf("Enter an unsigned integer: ");
scanf("%u", &unsignedInt);
// 读取浮点数
printf("Enter a float: ");
scanf("%f", &floatNum);
// 读取双精度浮点数
printf("Enter a double: ");
scanf("%lf", &doubleNum);
// 读取扩展双精度浮点数
printf("Enter a long double: ");
scanf("%Lf", &longDoubleNum); // %Lf中的L是大写
// 读取单个字符
printf("Enter a character: ");
scanf(" %c", &charVar); // 注意前面的空格以跳过任何前导空白符
// 读取字符串
printf("Enter a string: ");
scanf("%49s", str); // 限制读取49个字符以留出空间给'\0'
// 读取短整型
printf("Enter a short integer: ");
scanf("%hd", &shortInt); // %hd用于short int
// 读取长长整型
printf("Enter a long long integer: ");
scanf("%lld", &longLongInt); // %lld用于long long int
// 输出读取的数据
printf("Decimal integer: %d\n", decimalInt);
printf("Octal integer: %o\n", octalInt);
printf("Hexadecimal integer: %x\n", hexInt);
printf("Unsigned integer: %u\n", unsignedInt);
printf("Float: %f\n", floatNum);
printf("Double: %lf\n", doubleNum);
printf("Long double: %Lf\n", longDoubleNum);
printf("Character: %c\n", charVar);
printf("String: %s\n", str);
printf("Short integer: %hd\n", shortInt);
printf("Long long integer: %lld\n", longLongInt);
return 0;
}
运行结果如下:
测试代码3:
#include <stdio.h>
int main() {
int decimalInt = 123;
unsigned int unsignedInt = 456;
float floatNum = 3.14159f;
double doubleNum = 3.141592653589793;
char charVar = 'A';
char str[] = "Hello, World!";
unsigned int hex = 0x1A;
unsigned int oct = 012;
void *ptr = &decimalInt; // 指针
// 输出十进制整数
printf("Decimal integer: %d\n", decimalInt);
// 输出无符号整数
printf("Unsigned integer: %u\n", unsignedInt);
// 输出浮点数
printf("Float: %f\n", floatNum);
// 输出双精度浮点数
printf("Double: %lf\n", doubleNum);
// 输出单个字符
printf("Character: %c\n", charVar);
// 输出字符串
printf("String: %s\n", str);
// 输出十六进制整数
printf("Hexadecimal integer: %x\n", hex);
// 输出八进制整数
printf("Octal integer: %o\n", oct);
// 输出指针地址(注意转换为void*)
printf("Pointer address: %p\n", ptr);
// 输出%字符本身
printf("%% character: %%\n");
// 控制输出宽度和对齐
printf("Right-aligned integer (width 5): %5d\n", decimalInt);
printf("Left-aligned integer (width 5): %-5d\n", decimalInt);
return 0;
}
运行结果如下: