完成了第三章第一小节
This commit is contained in:
@@ -28,6 +28,11 @@
|
|||||||
- [防止写越界,防止内存泄漏,谁打开谁关闭,谁申请谁释放](#防止写越界防止内存泄漏谁打开谁关闭谁申请谁释放)
|
- [防止写越界,防止内存泄漏,谁打开谁关闭,谁申请谁释放](#防止写越界防止内存泄漏谁打开谁关闭谁申请谁释放)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# 第一章 绪论
|
# 第一章 绪论
|
||||||
|
|
||||||
课程地址,[史上最强最细腻的linux嵌入式C语言学习教程【李慧芹老师】_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV18p4y167Md/?spm_id_from=333.999.0.0&vd_source=4e03f52e94cfa281cde032856b1f93a7)。
|
课程地址,[史上最强最细腻的linux嵌入式C语言学习教程【李慧芹老师】_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV18p4y167Md/?spm_id_from=333.999.0.0&vd_source=4e03f52e94cfa281cde032856b1f93a7)。
|
||||||
|
|||||||
@@ -13,6 +13,10 @@
|
|||||||
- [表达式和语句的区别](#表达式和语句的区别)
|
- [表达式和语句的区别](#表达式和语句的区别)
|
||||||
- [运算符相关代码](#运算符相关代码)
|
- [运算符相关代码](#运算符相关代码)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# 第二章 数据类型,运算符和表达式
|
# 第二章 数据类型,运算符和表达式
|
||||||
|
|
||||||
## 数据类型(基本数据类型)
|
## 数据类型(基本数据类型)
|
||||||
|
|||||||
@@ -3,6 +3,14 @@
|
|||||||
- [第三章 输入输出专题](#第三章-输入输出专题)
|
- [第三章 输入输出专题](#第三章-输入输出专题)
|
||||||
- [内容](#内容)
|
- [内容](#内容)
|
||||||
- [格式化输入输出函数](#格式化输入输出函数)
|
- [格式化输入输出函数](#格式化输入输出函数)
|
||||||
|
- [`printf`](#printf)
|
||||||
|
- [`scanf`](#scanf)
|
||||||
|
- [字符输入输出函数](#字符输入输出函数)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# 第三章 输入输出专题
|
# 第三章 输入输出专题
|
||||||
|
|
||||||
@@ -12,9 +20,9 @@ input & output -> I/O(标准IO,文件IO)
|
|||||||
|
|
||||||
## 内容
|
## 内容
|
||||||
|
|
||||||
1. 格式化输入输出函数:`scanf`,`printf`
|
1. 格式化输入输出函数:`scanf`, `printf`
|
||||||
2. 字符输入输出函数:`getchar`,`putchar`
|
2. 字符输入输出函数:`getchar`, `putchar`
|
||||||
3. 字符串输入输出函数:`gets(!)`,`puts`
|
3. 字符串输入输出函数:`gets(!)`,`puts`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -24,9 +32,276 @@ input & output -> I/O(标准IO,文件IO)
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
### `printf`
|
||||||
|
|
||||||
```c
|
```c
|
||||||
int printf(const char *format, ...);
|
int printf(const char *format, ...);
|
||||||
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
|
||||||
|
// 不加\n,before 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;
|
||||||
|
// 不加\n,before 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
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,14 @@ int main()
|
|||||||
char str[STRSIZE] = "helloworld";
|
char str[STRSIZE] = "helloworld";
|
||||||
double dou = 123.456;
|
double dou = 123.456;
|
||||||
long long l = 123456;
|
long long l = 123456;
|
||||||
|
// 不加\n,before 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);
|
// printf("f = %8.1f\n", f);
|
||||||
// out:f = 123.5
|
// out:f = 123.5
|
||||||
// printf("i = %2d\n", i);
|
// printf("i = %2d\n", i);
|
||||||
@@ -45,5 +52,37 @@ int main()
|
|||||||
// dou = 123.456000
|
// dou = 123.456000
|
||||||
// l = 123456
|
// l = 123456
|
||||||
|
|
||||||
|
// printf("hello world!\n");
|
||||||
|
// 实参过多或者过少都会警告
|
||||||
|
// printf("#d #e\n", i);
|
||||||
|
// printf("#d #e\n", i, f, l);
|
||||||
|
|
||||||
exit(0);
|
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
83
Chapter3/IO/scanf.c
Normal 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);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user