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

06 | 字符串:彻底被你忽略的 printf 的高级用法

胡光 2020-01-16
你好,我是胡光,咱们又见面了,之前我们学习了基础数据类型,还有 scanf 函数和 printf 函数,这些知识都是单独的出现在我们之前的文章中的。今天呢,我将把它们组合在一起,给你展现一片新天地,你会掌握一种数据处理技巧,本质上是在上述几种数据类型之间做转换,从而使你对 scanf 函数和 printf 函数的理解更加深刻。
今天呢,我将给你介绍一种特殊的数组:字符数组,一种用来存储字符串信息的数组。来,跟我一起看看到底是怎么回事吧!

今日任务

首先,先让我们来看一下今天的任务。你还记得 printf 函数如何输出浮点型吧,那下面请你回忆一下,printf 函数在输出浮点型数据的时候,如何保留位数呢?下面的代码,演示了如何保留小数点后两位:
printf("%.2lf", 3.1415926);
%lf 是 double 双精度浮点型输出的格式占位符,当我们想要保留小数点后两位的时候,只需要在 % 和 lf 中间加上 .2 即可,2 写在 .(点) 的后面代表小数点后 2 位。
有了上面这个基础,现在我让你保留小数点后 2 位、3 位、4 位。对你来说肯定都不是什么难题了。先不要高兴太早,今天我们的任务是,实现一个能够保留小数点后 n 位的程序,这里的 n 是我们程序读入的一个变量。
例如,面对如下输入:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《人人都能学会的编程入门课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(12)

  • 1900
    其实还可以这样理解:
    scanf做的是从控制台console取数据,存入相应的变量中,sscanf就是从字符串(C语言没有字符串类型,故这里的字符串其实就是字符数组)中取数据,存入相应的变量中;
    同理,printf做的是将变量中的数据输出到控制台console,sprintf就是将变量中的数据输出到字符串中。

    综上,只需要将scanf和printf中提到的控制台换成字符串,然后对应sscanf和sprintf,这样就好理解了。

    作者回复: 对的!

    2020-01-28
    2
  • Makihao
    老师,你好 我是还不知道学习什么语言的时候看到你这篇文章,我是小白,有些部分感觉看的还不是太懂,比如课程里的“一起动手,搞事情”这一栏,能否在每次更新的一栏分享上一期你的思路代码,不然没有参考 感觉不懂越来越多 感谢老师

    作者回复: 后面的文章会集中答疑,别着急,动手搞事情不会做的话,就往后看看。以及先学习一些其他知识,记住,采用螺旋式上升的学习方法。

    2020-01-17
    1
    2
  • Geek_Andy_Lee00
    思考题(1)实现了,了解到原来sprintf返回的就是字符串的长度,思考题(2)没有想到,老师能指点一下迷津吗?

    作者回复: 今晚会发布题解,可以关注一下。

    2020-01-17
    1
    2
  • 奔跑的八戒
    sscanf 和 sprintf 函数,本质上在做的是以字符串为中间值,做各种数据类型之间的转换。自学c语言的时候,还真没怎么重视。

    作者回复: d(^_^o)

    2020-01-16
    2
  • Geek_Andy_Lee00
    老师,思考题(2)我想了下,代码如下,但是并没有输出单个字符,麻烦老师有时间也帮忙看下。(也是零基础,可能会有比较多的问题麻烦老师)
    int main(){
    char str[100];
    int i;
    sprintf(str, "%s", "I love China.");
    printf("%s", str);
    while (str[i] != '\0') printf("%s\n", str[i]);
    return 0;
    }

    作者回复: 你其中两个问题,第一i没有初始化0,第二循环内部,i没有自增,一直是同一个值。

    2020-01-17
    1
  • bug
    思考题目:sprintf的返回值为字符串占用空间的长度,减去1就是strlen(仅限英文字符)。
    遍历的话,就用while循环,判断获取到的某个字符是否有字符,没有就退出循环

    作者回复: 第一个,有个问题,仔细想想,sprintf返回值到底是什么?是字符串占用的空间么?
    第二个也有个问题,如何判断还有字符?

    2020-01-17
    1
    1
  • 徐洲更
    今天的作业(不包括思考题): https://github.com/xuzhougeng/learn-c-in-JKSJ/blob/master/jksj-06-sprintf-sscanf.c

    /* 知识点:
     * 1. 格式输入中, 为了表示一个%, 需要用%%
     * 2. sprintf: 将原本输出到屏幕的内容,保存到变量中
     * 3. sscanf: 将原本从屏幕接受的字符串输入,从字符串数组中读取
     * 4. 字符串数组需要以'\0'表示字符串的结束
     */
    收获: printf, scanf家族原来那么强大。不仅仅可以从屏幕中读取/输出信息,其实还可以对字符串数组中, 文件进行读取和写入

    作者回复: 不错,作业完成的很不错,不过要是能在主函数中加入一个 return 0; 就更完美了。

    2020-01-16
    1
    1
  • 月泉
    我也是第一次用到sscanf()和sprintf(),很赞👍
    2020-02-09
  • 信念
    不是说“hello world”这个字符串内容,长度是 11;“字符串占用空间”应该是 12。那为什么至少要定义长度为12的数组呢?不应该是11吗?

    char str[12] = "hello world";
    printf("%s", str);

    作者回复: 12,占用空间12,也就是说需要在存储空间中占12个存储单元。

    2020-02-07
    1
  • 不便明言
    老师,思考题1如下对吗?
    #include<stdio.h>
    void main()
    {
    char c[1];
    int s=0;
    printf("请输入一串字符:\n");
    scanf("%s",&c);
    s=sprintf(c,"%s",c);
    printf("%d\n",s);

    system("pause");
    return 0;
    }

    作者回复: 不对啊,你c那个字符数组怎么才1位呢?1位的字符数组,只能存字符串的结束符啊。

    2020-01-29
    1
  • 潮汐
    用\0判断字符数组是否到达尾部作终止条件,while循环,思考题1和2一下就可以通用相同思路。看到上面Lee0的代码一下子想通!
    看了评论说到sprintf返回值就是操作的字符串的长度的话,就可以更直接模拟strlen了。回去实验一下。
    给老师的课程点赞。学到了很多基础的知识。

    作者回复: 也给你坚持学习的精神点赞👍

    2020-01-21
  • 信念
    3.14159260000000006840537025709636509418487548828125000000000000000000000000000000
    这是当我将3.1415926 2保留80位小数点的结果,这是一个比较出人意料的结果,不过我觉得暂时也还没必要去了解它为什么是这样,因为我现在也有和上面的同胞一样的感觉,感觉思考题不会做,不过,我也愿意采纳胡老师的建议先学一些其他知识,回头再看看它,说不定我就会了,就理解了

    作者回复: 这个就要讲到浮点数的IEEE的标准表示法了。你可以先简单的理解成,任何数据底层都是二进制表示的,而有些数字没办法用二进制精确表示。例如0.4

    2020-01-17
    1
收起评论
12
返回
顶部