Printf
1.格式控制符
格式说明 | 表示内容 | 格式说明 | 表示内容 |
%d | 带符号的十进制整数(整型 int) | %c | 单个字符 char |
%ld | 长整型 long int | %s | 字符串 |
%f | 浮点型 float | %o | 八进制 |
%lf | 双精度浮点型double | %#o | 带前导的八进制 |
%% | 输出一个百分号 | %x | 十六进制(小写字母) |
%5d | 指定输出字段的最小宽度:5 ,不足5位则左侧补0 | %#x | 带前导的十六进制 |
%u: | 输出无符号的十进制整数 | %X | 输出十六进制整数(大写字母) |
%e 或 %E |
示例: double dnum = 3.14159; printf("%e", dnum); // 输出 3.141590e+00 printf("%E", dnum); // 输出 3.141590E+00 | %g 或 %G | 根据情况选择 %f 或 %e 形式输出 |
%p | 输出指针的值(地址) | %% | 输出 % 符号本身 |
示例:
1. int x=017; 一定要弄清楚为什么是这个结果!过程很重要
printf(“%d”, x); 15
printf(“%o”, x); 17
printf(“%#o”,x); 017
printf(“%x”, x); 11
printf(“%#x”,x); 0x11
2.printf(“a=%d,\n b=%d”,12, 34)那么输出的结果就是:a=12, b=34
3. 注意这种题型
int x=12,y=34;
char z=‘a’;
printf(“%d ”,x,y);// 一个格式说明,两个输出变量,后面的 y 不输出
printf(“%c”,z); // 结果为:12a
2.控制输出格式
除了基本的格式说明符外,还可以使用其他修饰符来控制输出的格式:
(1)宽度:
使用数字指定输出字段的最小宽度。
示例:
int num = 10;
printf("%5d", num); // 输出 " 10",前面有3个空格,不足5位则左侧补0
(2)精度:
对于浮点数,可以指定小数点后的位数。
示例:
float fnum = 3.14159;
printf("%.2f", fnum); // 输出 3.14
(3)对齐方式: (不指定对齐方式,默认就是右对齐)
使用 - 指定左对齐。
示例:
int num = 10;
printf("%-5d", num); // 输出 "10 ",空格在右边
(4)填充字符:
使用 0 指定使用零填充。
示例:
int num = 10;
printf("%05d", num); // 输出 "00010"
(5)正负号:
使用 + 强制输出正号。
示例:
int num = 10;
printf("%+d", num); // 输出 "+10"
6.转义序列
\n 表示换行。
\t 表示水平制表符。
7.举例说明:
printf(“%2d”,123 ); 第二部分有三位,大于指定的两位,原样输出 123
printf(“%5d”,123 ); 第二部分有三位,小于指定的五位,左边补两个空格 123 printf(“%10f”,1.25 ); 小数要求补足 6 位的,没有六位的补 0,。结果为 1.250000 printf(“%5.3f”,125 ); 小数三位,整个五位,结果为 1.250(小数点算一位)
printf(“%3.1f”,1.25 );小数一位,整个三位,结果为 1.3(要进行四舍五入)
scanf
1.输入格式控制符
(与prinft的表格同,不同的补充如下:)
%[...]
:读取符合指定字符集的字符串。%n
:读取到目前为止输入字符的数量。%*
:跳过读取的输出。
2.使用规范
1.、scanf(“ a=%d,b=%d”,&a,&b)
注意:在黑色屏幕上面输入的为 a=12,b=34 才可以把 12 和 34 正确给 a 和 b
2、scanf(“%d,%d”,&x,&y);scanf 的第二个部分一定要是地址!
3、特别注意指针在 scanf 的考察 例如: int x=2;int *p=&x;
scanf(“%d ”,x); 错误 scanf(“%d”,p);正确
scanf(“%d”,&p); 错误 scanf(“%d”,*p)错误
4、指定输入的长度
终端输入:1234567
scanf(“%2d%4d%d”,&x,&y,&z);x 为 12,y 为 3456,z 为 7
终端输入:1 234567 由于 1 和 2 中间有空格,所以只有 1 位给 x
scanf(“%2d%4d%d”,&x,&y,&z);x 为 1,y 为 2345,z 为 67
5、字符和整型是近亲:
int x=97;
printf(“%d”,x); 结果为 97
printf(“%c”,x); 结果为 a
6、输入时候字符和整数的区别
scanf(“%d”,&x);这个时候输入 1,特别注意表示的是整数 1
scanf(“%c”,&x);这个时候输入 1,特别注意表示的是字符‘1 ’ASCII 为整数 49。 补充说明:
1)scanf 函数的格式考察:
注意该函数的第二个部分是&a 这样的地址,不是 a;
scanf(“%d%d%*d%d ”,&a,&b,&c); 跳过输入的第三个数据。
2)putchar ,getchar 函数的考查:
char a = getchar() 是没有参数的,从键盘得到你输入的一个字符给变量 a。
putchar(‘y ’)把字符 y 输出到屏幕中。
3)如何实现两个变量 x ,y 中数值的互换: t=x;x=y;y=t。
7、输入数据规范:
scanf("%d%d",&a,&b); //(两个%d之间无空格)输入a和b的值时用空格隔开
scanf("%d %d",&a,&b); //(两个%d之间有空格)输入a和b的值时用空格隔开
scanf("%d,%d",&c,&d); //输入c和d的值时用逗号(,)隔开
按下回车表示数据输入完成,继续运行程序
3. 注意事项
1. 默认情况下,scanf
会忽略任何空白字符(包括空格、制表符和换行符),除非格式串中有明确指定。
假设我们需要读取一系列由空格分隔的整数和浮点数,但是我们希望 scanf
不忽略空格,而是将其作为输入的一部分读取。
1#include <stdio.h>
2
3int main() {
4 int num;
5 float value;
6
7 printf("Enter an integer followed by a space and then a floating point number: ");
8 if (scanf("%d %f", &num, &value) == 2) {
9 printf("You entered: %d and %.2f\n", num, value);
10 } else {
11 printf("Invalid input.\n");
12 }
13
14 return 0;
15}
//在这个例子中,scanf
会读取一个整数和一个浮点数,其中的空格会被忽略。
2. 如果需要读取包含空格的字符串,可以使用 %[^\n]
来读取直到遇到换行符为止。
如果我们想要读取一行文本,即使这行文本中包含了空格,我们可以使用 %[^\n]
。
1#include <stdio.h>
2
3int main() {
4 char str[100];
5
6 printf("Enter a line of text: ");
7 if (scanf("%[^\n]", str) != EOF) {
8 printf("You entered: %s\n", str);
9 } else {
10 printf("Invalid input.\n");
11 }
12
13 return 0;
14}
//这里 %[^\n] 会读取直到换行符之前的所有字符。
3. 使用 *
忽略某些输入,例如 scanf("%*[^]] %d", &num)
可以忽略方括号内的内容。
假设我们需要读取一行文本,其中包含了一些不需要的信息,这些信息放在方括号内,我们只关心方括号后面的一个整数。
1#include <stdio.h>
2
3int main() {
4 int num;
5
6 printf("Enter a line with [some info] and then a number: ");
7 if (scanf("%*[^]] %d", &num) == 1) {
8 printf("You entered: %d\n", num);
9 } else {
10 printf("Invalid input.\n");
11 }
12
13 return 0;
14}
//这里 %*[^]]
会读取直到方括号 ]
之前的字符,并忽略它们,接着读取一个整数。
4. 使用 getchar()
清除输入缓冲区中的多余字符,避免下一次 scanf
调用时出现问题。
如果用户输入了多余的信息,例如在输入整数后多按了一个回车键,这会导致下一次 scanf
调用时出现问题。我们可以使用 getchar()
来清除缓冲区中的多余字符。
1#include <stdio.h>
2
3int main() {
4 int num;
5
6 printf("Enter an integer: ");
7 if (scanf("%d", &num) == 1) {
8 printf("You entered: %d\n", num);
9 // 清除缓冲区中的多余字符
10 while (getchar() != '\n') ;
11 } else {
12 printf("Invalid input.\n");
13 }
14
15 return 0;
16}
//这里 while (getchar() != '\n') ;
会读取直到遇到换行符为止的所有字符,从而清空输入缓冲区。
字符的输入输出
-
putchar( c )
1.功能
putchar
用于输出一个字符到标准输出流(通常是屏幕)。- 返回值是输出的字符。
2.注意事项
- 类型转换:
- 如果传递给
putchar
的不是字符类型,会自动进行类型转换。
- 如果传递给
- 输出缓冲:
- 输出可能受到缓冲的影响,也就是说,字符可能不会立即显示在屏幕上,除非缓冲区满了或遇到了换行符。
- 错误处理:
- 如果输出失败,
putchar
返回EOF
。
- 如果输出失败,
-
getchar( c ) // 读取一个字符,包括空格和制表符。
1.功能
getchar
用于从标准输入流(通常是键盘)读取一个字符。- 返回值是读取的字符。
2.注意事项
- 读取一个字符:
getchar
读取一个字符,包括空格和制表符。
- 读取多个字符:
- 如果连续调用
getchar
,它将继续读取后续的字符,直到遇到文件结束标志(EOF)。
- 如果连续调用
- 文件结束标志(EOF):
- 当达到文件结束(EOF)时,
getchar
返回EOF
。
- 当达到文件结束(EOF)时,
- 缓冲区问题:
getchar
读取的字符可能会被缓存在输入缓冲区中。
- 错误处理:
- 如果发生错误,
getchar
返回EOF
。
- 如果发生错误,
使用示例:
#include <stdio.h>
int main() {
char ch;
// 输出字符 'A'
putchar('A');
// 从标准输入读取一个字符
ch = getchar();
printf("You entered: %c\n", ch);
// 再次读取一个字符
ch = getchar();
printf("Next character: %c\n", ch);
return 0;
}