不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

自己动手实现低配版 scanf 函数

任务

仿照 scanf 函数,实现一个低配版的 my_scanf 函数。这个函数的功能,简单来说就是将一个字符串信息转换成整型数字,能够完成这个任务,你会更深刻的理解 scanf 函数,更深刻的理解参数设计。

例如:

1
2
3
4
5
6
7
8
9
//第一个基础功能
int n = 98;
my_scanf("12345", &n);
printf("%d", n); // 输出 12345,而不是 98

//第二个基础功能
int n = 98, m = 0;
my_scanf("123 45", &n, &m);
printf("n = %d m = %d", n, m); // 输出 n = 123 m = 45

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
void my_scanf(char *str, int *ret) {
int num = 0, flag = 0; //定义存放转换结果的 num 变量,用来标记正负数的flag 变量。0 代表正数,1 代表负数。
if (str[0] == '-') str += 1, flag = 1; //判断字符串中的第一位是不是字符 ‘-’,如果是字符 ‘-’,就将 flag 标记为 1,并且把 str 字符指针所指的位置,向后跳动一位,因为 ‘-’ 后面就是要转换的第一个数字字符了。
for (int i = 0; str[i]; i++) {
num = num * 10 + (str[i] - '0'); //遍历字符串剩余的每一位,每次将当前字符所代表的数字,放到 num 数字的末尾。
}
if (flag == 1) num = -num; //如果是负数,数字前需要加-
*ret = num; //把 num 中的值拷贝到 ret 所指向的存储区中,也就是主函数中的 n 变量的内存区中。
return ;
}
int main() {
char str[1000]; //定义字符数组 str
int n = 65; //定义整型变量 n
scanf("%s", str); //读入一个字符串,将其保存在字符数组中
my_scanf(str, &n); //使用 my_scanf 函数将字符数组中的字符串信息,转换成为整型信息存储在 n 中
printf("n = %d\n", n); //使用 printf 函数输出 n 的值,加以确认
return 0;
}

小结

  • 函数的作用,是做功能封装,以便在程序其他地方复用相关功能。
  • 函数的参数传递过程,就是“实参”给“形参”赋值的过程,“实参”与“形参”之间互相独立,互不影响。
  • 在函数参数设计中,一定要分清楚,传入参数和传出参数在功能上的差别。
------ 本文结束------
如果本篇文章对你有帮助,可以给作者加个鸡腿~(*^__^*),感谢鼓励与支持!