人人都能学会的编程入门课
胡光
原百度高级算法研发工程师
立即订阅
953 人已学习
课程目录
已更新 15 讲 / 共 32 讲
0/2登录后,你可以任选2讲全文学习。
开篇词 (1讲)
开篇词 | 别闹了,学编程 ≠ 学语言
免费
语言基础篇 (13讲)
01 | 学习编程,我到底该选择哪门语言?
02 | 第一个程序:教你输出彩色的文字
03 | 判断与循环:给你的程序加上处理逻辑
04 | 随机函数:随机实验真的可以算 π 值嘛?
05 | 数组:一秒钟,定义 1000 个变量
06 | 字符串:彻底被你忽略的 printf 的高级用法
做好闭环(一):不看答案可能就白学了
07 | 指针系列(一):记住,指针变量也是变量
08 | 指针系列(二):记住,指针变量也是变量
09 | 函数:自己动手实现低配版 scanf 函数
10 | 预处理命令(上):必须掌握的“黑魔法”,让编译器帮你写代码
11 | 预处理命令(下):必须掌握的“黑魔法”,让编译器帮你写代码
做好闭环(二):函数是压缩的数组,数组是展开的函数
测试篇 (1讲)
期中测试 | 给语言基础篇交一份满分答卷,去迎接新的挑战!
人人都能学会的编程入门课
登录|注册

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

胡光 2020-01-25
你好,我是胡光,今天是大年初一,是咱们中国传统的重要节日,春节!能在这样的节日氛围里,还能坚持过来学习的,我必须要说一声“鼠”你最优秀!在这里我也祝福热爱学习的你,在新的一年,身体健康,阖家欢乐!
今天呢,我们的学习课程也将迎来里程碑式的一课。所谓里程碑,是因为在这一节之前,你写的程序,只是片段,只是思想的随意表达,而通过了本节的学习,你的程序结构将发生翻天覆地的变化,会变得规格严整,变得可以复用,变得易于找错。
前面的课程,我们主要就是在一些基本的程序结构中做学习,包括顺序结构,分支结构以及循环结构。今天这一节中,我们将要认识的函数,可以将功能封装成可以复用的模块,就像创造乐高积木一样,废话不多说,开始今天的学习吧。

今日任务

对程序的输入输出函数,你应该已经很熟悉了。今天我们仿照 scanf 函数,实现一个低配版的 my_scanf 函数。这个函数的功能,简单来说就是将一个字符串信息转换成整型数字,能够完成这个任务,你会更深刻的理解 scanf 函数,更深刻的理解参数设计。下面给你几个例子。
首先先来看第一个基础功能:
int n = 98;
my_scanf("12345", &n);
printf("%d", n); // 输出 12345,而不是 98
上面这段代码中,我们利用 my_scanf 函数,将字符串信息转换成了整型数据,并且将结果存储到了 n 变量的内存空间中,调用 printf 函数打印 n 变量值的时候,输出的信息不是 n 变量原有的初值 98,而是 12345。对于这个基础的转换功能,要考虑兼容负数的情况。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《人人都能学会的编程入门课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(3)

  • 徐洲更
    知识点:
    1. 函数的实参和形参,形参修改不会修改实参
    2. 为了在函数中更改函数外的参数,可以传入指针,直接修改内存里的内容
    3. 快速将'0'-'9'字符转成数字0-9的方法, '9' - '0'
    4. 流处理方式转换字符串为数字, num = num * 10 + (str[i] - '0')

    题目做题过程在GitHub上, https://github.com/xuzhougeng/learn-c-in-JKSJ/blob/master/jksj-09-myscanf

    作者回复: 不错!作业题目做的很棒。完全达到了自学的要求!

    2020-01-25
    1
  • 信念
    #include<stdio.h>
    int main(){
      int n = 98;
      my_scanf("12345", &n);
      printf("%d", n); // 输出 12345,而不是 98
    return 0;
    }
    这是老师您的程序,但是在我编译时出现了问题,问题如下,麻烦老师看一下:
    test35.cpp: In function ‘int main()’:
    test35.cpp:4:3: error: ‘my_scanf’ was not declared in this scope
       my_scanf("12345", &n);
       ^~~~~~~~
    test35.cpp:4:3: note: suggested alternative: ‘vsscanf’
       my_scanf("12345", &n);
       ^~~~~~~~
       vsscanf
    好像是说没有声明my_scanf
    2020-02-09
  • 小林coding
    老师,我的可变参数的myScanf函数
    代码:
    #include <iostream>
    #include <stdarg.h>

    void myScanf(const char *format, int *pInt, ...) {
        va_list ap;
        int *p = NULL;
        int num = 0;
        int cnt = 0;

        va_start(ap, pInt);

        while (*format) {
            if (*format == ' ') {
                if (cnt == 0) {
                    *pInt = num;
                } else {
                    p = va_arg(ap, int*);
                    *p = num;
                }
                num = 0;
                cnt++;
            } else {
                num = num * 10 + *format - '0';
            }

            format++;
        }

        p = va_arg(ap, int*);
        *p = num;

        va_end(ap);
    }

    int main() {
        int n, m, j;
        myScanf("123 456 789", &n, &m, &j);
        std::cout << n << " " << m << " " << j << std::endl;
        return 0;
    }

    输出:
    123 456 789

    作者回复: 可以打80分,稍微有点儿缺憾的就是:没有考虑负数的情况哦。d(^_^o)

    2020-02-01
    1
收起评论
3
返回
顶部