标准文件 | 文件指针 | 设备 |
---|---|---|
标准输入 | stdin | 键盘 |
标准输出 | stdout | 屏幕 |
标准错误 | stderr | 您的屏幕 |
标准输入/输出的函数在标准库stdio.h。
#include <stdio.h>
1、printf 输出
printf :格式化输出,输出到标准输出stdout中。
printf: int printf(const char *format, ...)
参数:format是字符串(包含输出的内容,也可以包含占位符(格式化说明符))。
返回:输出的字符总数。若失败,返回负数。
注意:printf 输出不包括换行符'\n',需手动添加。
format 说明符(占位符):
类型 | 合格的输入 | 参数的类型 |
---|---|---|
%a、%A | 读入一个浮点值(仅 C99 有效)。 | float |
%f、%F | 浮点数。以小数形式输出单、双精度实数。例如:-732.103 | float |
%e、%E | 浮点数。以指数形式输出单、双精度实数。例如:7.12e4 | float |
%g、%G | 浮点数。以%f或%e中较短的输出宽度输出单、双精度实数 | float |
%i | 读入十进制,八进制,十六进制整数 。 | int |
%d | 十进制整数。正数不输出符号 | int |
%o | 八进制整数。 | int |
%x、%X | 十六进制整数。 | int |
%u | 无符号的十进制整数。 | unsigned int |
%c | 单个字符 | char |
%s | 字符串。将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。 | char |
%p | 读入一个指针 。(指针存储内存地址。获取内存地址:&变量名) | |
%[] | 扫描字符集合 。 | |
%% | 读 % 符号。 |
#include <stdio.h>
int main(void)
{
int i = 10;
float f = 3.1415926;
char c = 'a';
char s[6] = "hello";
printf("int m: %6d \n", i); // 宽度为6的整数
printf("float k: %.2f \n", f); // 2位小数的浮点数
printf("char c: %c \n", c); // 单个字符
printf("string s: %s \n", s); // 字符串
printf("string s = %s, the first char is %c \n", s, s[0]); // 字符串中第一个字符
printf("int m memory address is %p \n", &i); // 整数m的内存地址
return 0;
}
// 结果:
int m: 10
float k: 3.14
char c: a
string s: hello
string s = hello, the first char is h
int m memory address is 000000000061FE14
2、scanf 输入
scanf :从标准输入stdin,读取格式化输入。
scanf: int scanf(const char *format, ...)
参数:format是字符串(包括占位符)。
返回:成功匹配或赋值的个数。若到达文件末尾或发生错误,返回NULL。
注意:scanf 碰到空格就停止读取。
// scanf 不能显示输入的提示信息,用printf 提前输出提示信息。
#include <stdio.h>
int main(void)
{
char s[16];
printf("Input: ");
scanf("%s", s); // 读取输入的字符串
printf("Output: %s", s);
return 0;
}
// 结果:
Input: good luck 【输入:good luck】
Output: good
// 若scanf中有提示信息,则输入内容时要手动把提示信息一并输入。
#include <stdio.h>
int main(void)
{
char s[16];
// printf("Input: ");
scanf("Input: %s", s); // 读取输入的字符串(提示信息也需输入)
printf("Output: %s", s);
return 0;
}
// 结果:
Input: good luck 【输入:Input: good luck】
Output: good
字符串是指针,指向字符数组。字符串名本身就表示了内存地址(第一个字符的内存地址)。
而整数,则需要通过 "&变量名" 获取内存地址。
#include <stdio.h>
int main(void)
{
int m, n;
printf("Input two number: ");
scanf("%d %d", &m, &n); // 读取输入的整数
printf("Output two number: %d %d", m, n);
return 0;
}
// 结果:
Input two number: 1 2 【输入:1 2】
Output two number: 1 2
3、gets, puts 输入/输出整行字符
gets(s):读取输入的一行字符串,从标准输入stdin读取一行 并存储到字符串s指向的内存空间。
gets: char *gets(char *str)
参数:str是指向字符数组的指针,该数组存储读取的字符串。
返回:指针,指向读取到的字符串。若没有读取到内容或发生错误,返回NULL。
注意:读取到换行符 或到达文件末尾 就停止。
可能导致缓冲区溢出,若避免,可使用fgets函数,例如:fgets(str, 20, stdin)从标准输入stdin读取最多20个字符(包括结束符'\0')存储到str指向的内存。
puts(s):输出字符串,将字符串s写入到标准输出stdout中。
puts: int puts(const char *str)
参数:str是要输出的字符串。
返回:字符串长度(包括结束符'\0')。若发生错误,返回NULL。
注意:碰到空字符就停止,且输出中不包括空字符。换行符会被追加到输出中(即输出中包括换行符'\n')。
#include <stdio.h>
int main(void)
{
char s[16];
printf("Input: ");
gets(s); // 读取输入的内容
printf("Output: ");
puts(s); // 输出读取的内容
return 0;
}
// 结果:
Input: good luck 【输入:good luck】
Output: good luck
4、getchar, putchar 输入/输出一个字符
getchar():读取输入的一个字符,从标准输入stdin获取一个字符(包括回车)。
getchar: int getchar(void)
参数:无。
返回:读取的字符(无符号char强制转为int形式) 。如果到达文件末尾或发生读错误,则返回 EOF。
注意:正常输入以按回车(换行符'\n') 结束。
putchar(c):输出一个字符,即将指定字符写入到标准输出stdout。
putchar: int putchar(int char)
参数:char是要输出的字符。
返回:输出的字符(无符号char强制转为int形式) 。如果发生错误,则返回 EOF。
#include <stdio.h>
int main(void)
{
char c;
printf("Enter a value: ");
c = getchar(); // 读取输入的内容
printf("The value is: ");
putchar(c); // 输出一个字符
return 0;
}
// 结果:
Enter a value: abc 【输入abc】
The value is: a
同一时间只能输入/输出一个字符,可用循环输入/输出多个字符。
#include <stdio.h>
int main(void)
{
printf("Enter a value: ");
char c;
// 通过循环输入/输出多个字符
while((c = getchar()) != '\n' && c != EOF)
{
putchar(c);
}
return 0;
}
// 结果:
Enter a value: abc 【输入abc】
abc