人人都能学会的编程入门课
胡光
原百度高级算法研发工程师
19410 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
开篇词 (1讲)
人人都能学会的编程入门课
15
15
1.0x
00:00/00:00
登录|注册

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

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

今日任务

首先,先让我们来看一下今天的任务。你还记得 printf 函数如何输出浮点型吧,那下面请你回忆一下,printf 函数在输出浮点型数据的时候,如何保留位数呢?下面的代码,演示了如何保留小数点后两位:
printf("%.2lf", 3.1415926);
%lf 是 double 双精度浮点型输出的格式占位符,当我们想要保留小数点后两位的时候,只需要在 % 和 lf 中间加上 .2 即可,2 写在 .(点) 的后面代表小数点后 2 位。
有了上面这个基础,现在我让你保留小数点后 2 位、3 位、4 位。对你来说肯定都不是什么难题了。先不要高兴太早,今天我们的任务是,实现一个能够保留小数点后 n 位的程序,这里的 n 是我们程序读入的一个变量。
例如,面对如下输入:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了 C 语言中 printf 函数的高级用法,重点讲解了如何在输出浮点型数据时保留特定位数的小数,并通过示例代码展示了实现的方法。文章还提出了一个任务,要求读入一个浮点数和一个整数,然后根据整数的值保留相应位数的小数并输出。作者指出了一个设计不太优美的程序示例,并提出了通过学习来尝试解决这个问题。此外,文章还介绍了字符串和字符数组的概念,以及字符串操作函数 sscanf 和 sprintf 的用法。通过阅读本文,读者可以掌握 C 语言中字符串操作的灵活应用,提高程序设计的技能和效率。文章内容丰富,涵盖了 C 语言中的字符串操作和字符数组的使用,为读者提供了丰富的技术知识和实用技巧。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《人人都能学会的编程入门课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(26)

  • 最新
  • 精选
  • 1900
    其实还可以这样理解: scanf做的是从控制台console取数据,存入相应的变量中,sscanf就是从字符串(C语言没有字符串类型,故这里的字符串其实就是字符数组)中取数据,存入相应的变量中; 同理,printf做的是将变量中的数据输出到控制台console,sprintf就是将变量中的数据输出到字符串中。 综上,只需要将scanf和printf中提到的控制台换成字符串,然后对应sscanf和sprintf,这样就好理解了。

    作者回复: 对的!

    2020-01-28
    12
  • 学写代码的猪
    sscanf 和 sprintf 函数,本质上在做的是以字符串为中间值,做各种数据类型之间的转换。自学c语言的时候,还真没怎么重视。

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

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

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

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

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

    2020-01-17
    2
    2
  • 罗耀龙@坐忘
    茶艺师学编程 作业又是卡了好几天。在这里说说我踩的坑(主要都是在思考题二)。 1、我一直在想字符串的定位输出。比如printf("%s",a[i]),但这是不行的,printf输出就只能是整个字符串a; 2、我看见浮点数能“%.nlf”定位数输出,妄想字符也能这样,但实际这个仅仅是按照规定的位数输出······是我想多了; 3、我也试过模仿文章中的例子把“字符+\n”整合进新的字符串里输出,但也办不到; 交作业: 第一部分: /*strlen*/ #include <stdio.h> #include <string.h> int main(){ char b[]="I love you"; char a[30]; printf("要计算的字符串内容为:%s\n",b); sprintf(a,"%d",sizeof(b)-1); printf("字符串的长度为:%s\n",a); return 0; } /*stycpy*/ #include <stdio.h> #include <string.h> #include <stdlib.h> int main(){ char a[100]="I love you"; char b[]="1234567890"; printf("a原来的内容:%s\n",a); printf("b原来的内容:%s\n",b); system("pause"); sprintf(a,"%s",b); printf("复制后a的内容:%s\n",a); printf("复制后b的内容:%s\n",b); return 0; } /*strcat*/ #include <stdio.h> #include <string.h> #include <stdlib.h> int main(){ char a[]="123"; char b[]="456789"; char c[100]; printf("a原来的内容:%s\n",a); printf("b原来的内容:%s\n",b); system("pause"); sprintf(c,"%s%s",a,b); printf("处理后a的内容:%s\n",c); printf("处理后b的内容:%s\n",b); return 0; } 第二部分: /*思考题(2):优美的遍历技巧介绍完了字符串的相关知识以后,请思考如下问题,如何在不计算字符串长度的情况下,遍历字符串的每一位呢? 程序设计要求是,读入一个字符串,然后在不计算字符串长度的情况下,输出字符串中的每一个字符,每个字符占一行。 其中所谓计算字符串长度的方法,包括但不限于 strlen,sprintf,先行 for 循环遍历统计等。*/ #include <stdio.h> #include <string.h> int main(){ char b; printf("请输入要装逼的字符串\n"); do{ //do while循环,遍历到输入的字符串结尾“\n” b=getchar(); //字符读入不只有scanf。 putchar(b); //字符输出也不只有printf。 printf("\n"); }while(b!='\n');//字符对应的引号为'',而不是"" return 0; }

    作者回复: d(^_^o) 很棒!

    2020-05-16
    1
  • Jinlee
    老师,思考题(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
  • 一日
    思考题目:sprintf的返回值为字符串占用空间的长度,减去1就是strlen(仅限英文字符)。 遍历的话,就用while循环,判断获取到的某个字符是否有字符,没有就退出循环

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

    2020-01-17
    2
    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
    2
    1
  • Zz
    //思考题(2) #include <stdio.h> int main() { char two[80] = {"hellow world"}; //char one[80]; //int i=sprintf(one, "%s",two);//返回字符串长度 for(int j=0;j<strlen(two);j++) { printf("%c\n",two[j]); } return 0; }

    作者回复: 返回字符串长度的方法是正确的。

    2020-05-28
  • Zz
    #include <stdio.h> int main() { char str[100]; int temp=sprintf(str,"%s%s","1234","5678"); printf("%s\n",str);//strcpy,strcat printf("%d",temp);//strlen return 0; }

    作者回复: 连接字符串的方法是正确的

    2020-05-28
收起评论
显示
设置
留言
26
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部