完成了第三章第一小节

This commit is contained in:
lzy
2024-03-19 17:46:17 +08:00
parent ad3056a8b8
commit 308c9753bb
5 changed files with 421 additions and 15 deletions

View File

@@ -3,6 +3,14 @@
- [第三章 输入输出专题](#第三章-输入输出专题)
- [内容](#内容)
- [格式化输入输出函数](#格式化输入输出函数)
- [`printf`](#printf)
- [`scanf`](#scanf)
- [字符输入输出函数](#字符输入输出函数)
# 第三章 输入输出专题
@@ -12,9 +20,9 @@ input & output -> I/O(标准IO文件IO)
## 内容
1. 格式化输入输出函数:`scanf`,`printf`
2. 字符输入输出函数:`getchar`,`putchar`
3. 字符串输入输出函数:`gets(!)``puts`
1. 格式化输入输出函数:`scanf`, `printf`
2. 字符输入输出函数:`getchar`, `putchar`
3. 字符串输入输出函数:`gets(!)`,`puts`
@@ -24,9 +32,276 @@ input & output -> I/O(标准IO文件IO)
![标准输出修饰符](https://s2.loli.net/2024/03/18/Z6gVaw1AOJ87Uil.png)
### `printf`
```c
int printf(const char *format, ...);
format: "%【修饰符】格式字符"
```
- 有关`l`修饰符的提醒
```C
int main()
{
FILE *fp;
long a = 11;
fp = fopen();
// 可行a定义了long型与函数要求一致
func(fp, a);
// 早期的编译器不认可这个12没有单位不同编译器默认类型不同
// 需要加上L修饰符
func(fp, 12);
func(fp, 12L);
// 对于func(FILE *fp, long long i)
func(fp, 12LL);
}
```
传输一个5G的文件
```c
5LL*1204LL*1204LL*1204LL
```
定义一个宏,表示一年有多少秒
```c
// 定义一年有多少秒
#define SEC_YEAR (60LL * 60LL * 24LL * 365LL)
```
- 函数 变参与定参重载的区别
- 变参:编译器只报警告,函数自己都不知道自己有多少个参数
- 定参重载:编译报错
- `\n`的作用
强制刷新缓冲区,以死循环调试举例。
```c
// 不加\nbefore while()存入了缓冲区,故不输出
// printf("[%s:%d]before while().", __FUNCTION__, __LINE__);
printf("[%s:%d]before while().\n", __FUNCTION__, __LINE__);
while (1)
{
}
// printf("[%s:%d]after while().", __FUNCTION__, __LINE__);
printf("[%s:%d]after while().\n", __FUNCTION__, __LINE__);
```
- 完整代码
```c
#include <stdio.h>
#include <stdlib.h>
/***
* printf("%[修饰符]格式字符", 输出表项);
*
*/
#define STRSIZE 10
int main()
{
// printf("hello world\n");
// char ch = 65;
// printf("%c\n", ch);
// out: A
int i = 255;
float f = 123.45678;
char str[STRSIZE] = "helloworld";
double dou = 123.456;
long long l = 123456;
// 不加\nbefore while()存入了缓冲区,故不输出
// printf("[%s:%d]before while().", __FUNCTION__, __LINE__);
printf("[%s:%d]before while().\n", __FUNCTION__, __LINE__);
while (1)
{
}
// printf("[%s:%d]after while().", __FUNCTION__, __LINE__);
printf("[%s:%d]after while().\n", __FUNCTION__, __LINE__);
// printf("f = %8.1f\n", f);
// out:f = 123.5
// printf("i = %2d\n", i);
// out: i = 123
// printf("%-10.5s[over]\n", str);
// printf("%+10.5s[over]\n", str);
// out:
// hello [over]
// hello[over]
// 同样对于i进行八进制核对十六进制的输出
// printf("i = %#o\n", i);
// out: i = 0377
// printf("i = %#x\n", i);
// out: i = 0xff
// printf("dou = %lf\n", dou);
// printf("l = %ld\n", l);
// out:
// dou = 123.456000
// l = 123456
// printf("hello world!\n");
// 实参过多或者过少都会警告
// printf("#d #e\n", i);
// printf("#d #e\n", i, f, l);
exit(0);
}
#if 0
func(FILE *fp, long i)
{
}
int main()
{
FILE *fp;
long a = 11;
fp = fopen();
// 可行a定义了long型与函数要求一致
func(fp, a);
// 早期的编译器不认可这个12没有单位不同编译器默认类型不同
// 需要加上L修饰符
func(fp, 12);
func(fp, 12L);
// 对于func(FILE *fp, long long i)
func(fp, 12LL);
}
#endif
// 定义一年有多少秒
#define SEC_YEAR (60LL * 60LL * 24LL * 365LL)
```
### `scanf`
```c
int scanf(const char *format, );
format:*
```
- 完整代码
```c
#include <stdio.h>
#include <stdlib.h>
/**
* int scanf(const char *format, 地址表);
*/
// #define STRSIZE 32
#define STRSIZE 3
// 除掉尾0占一个
// 相当于只能两个字符
// 但是这时候运行输入hello不会报错
// 实际上是越界了
int main()
{
int i;
float f;
char str[STRSIZE];
int ret;
char ch;
printf("Please enter:\n");
// scanf("%d", &i);
// ch = getchar();
// printf("i = %d, ch = %c\n", i, ch);
/*
out:
Please enter:
4 h
i = 4, ch =
ch被吞掉了
*/
// scanf("%d", &i);
// scanf("%*c%c", &ch);
// 用 '%*c' 吃掉回车
/*
out:
Please enter:
5
h
i = 5, ch = h
*/
printf("i = %d, ch = %c\n", i, ch);
#if 0
// 输入a直接卡死scanf直接放在循环中很危险
// 需要加入校验用ret接收scanf返回值
while (1)
{
// scanf("%d", &i);
ret = scanf("%d", &i);
if (ret != 1)
{
printf("Enter Error!\n");
break;
}
printf("i = %d\n", i);
}
#endif
// printf("Please enter fot str:\n");
// 这种情况下,不能有任何间隔符
// 输入hello world只会得到hello
// 对于scanf不建议'%s'
// scanf("%s", str);
// printf("%s\n", str);
// printf("Please enter for i[int]:\n");
// 这里两个数字之间有',',输入就一定要有','
// 最好不加,空格符可以是空格 回车 tab
// scanf("%d,%f", &i, &f);
// printf("i = %d\n", i);
// printf("f = %f\n", f);
exit(0);
}
```
## 字符输入输出函数
S

View File

@@ -21,7 +21,14 @@ int main()
char str[STRSIZE] = "helloworld";
double dou = 123.456;
long long l = 123456;
// 不加\nbefore while()存入了缓冲区,故不输出
// printf("[%s:%d]before while().", __FUNCTION__, __LINE__);
printf("[%s:%d]before while().\n", __FUNCTION__, __LINE__);
while (1)
{
}
// printf("[%s:%d]after while().", __FUNCTION__, __LINE__);
printf("[%s:%d]after while().\n", __FUNCTION__, __LINE__);
// printf("f = %8.1f\n", f);
// out:f = 123.5
// printf("i = %2d\n", i);
@@ -45,5 +52,37 @@ int main()
// dou = 123.456000
// l = 123456
// printf("hello world!\n");
// 实参过多或者过少都会警告
// printf("#d #e\n", i);
// printf("#d #e\n", i, f, l);
exit(0);
}
}
#if 0
func(FILE *fp, long i)
{
}
int main()
{
FILE *fp;
long a = 11;
fp = fopen();
// 可行a定义了long型与函数要求一致
func(fp, a);
// 早期的编译器不认可这个12没有单位不同编译器默认类型不同
// 需要加上L修饰符
func(fp, 12);
func(fp, 12L);
// 对于func(FILE *fp, long long i)
func(fp, 12LL);
}
#endif
// 定义一年有多少秒
#define SEC_YEAR (60LL * 60LL * 24LL * 365LL)

83
Chapter3/IO/scanf.c Normal file
View File

@@ -0,0 +1,83 @@
#include <stdio.h>
#include <stdlib.h>
/**
* int scanf(const char *format, 地址表);
*/
// #define STRSIZE 32
#define STRSIZE 3
// 除掉尾0占一个
// 相当于只能两个字符
// 但是这时候运行输入hello不会报错
// 实际上是越界了
int main()
{
int i;
float f;
char str[STRSIZE];
int ret;
char ch;
printf("Please enter:\n");
// scanf("%d", &i);
// ch = getchar();
// printf("i = %d, ch = %c\n", i, ch);
/*
out:
Please enter:
4 h
i = 4, ch =
ch被吞掉了
*/
// scanf("%d", &i);
// scanf("%*c%c", &ch);
// 用 '%*c' 吃掉回车
/*
out:
Please enter:
5
h
i = 5, ch = h
*/
printf("i = %d, ch = %c\n", i, ch);
#if 0
// 输入a直接卡死scanf直接放在循环中很危险
// 需要加入校验用ret接收scanf返回值
while (1)
{
// scanf("%d", &i);
ret = scanf("%d", &i);
if (ret != 1)
{
printf("Enter Error!\n");
break;
}
printf("i = %d\n", i);
}
#endif
// printf("Please enter fot str:\n");
// 这种情况下,不能有任何间隔符
// 输入hello world只会得到hello
// 对于scanf不建议'%s'
// scanf("%s", str);
// printf("%s\n", str);
// printf("Please enter for i[int]:\n");
// 这里两个数字之间有',',输入就一定要有','
// 最好不加,空格符可以是空格 回车 tab
// scanf("%d,%f", &i, &f);
// printf("i = %d\n", i);
// printf("f = %f\n", f);
exit(0);
}