06 | 字符串:彻底被你忽略的 printf 的高级用法
胡光
你好,我是胡光,咱们又见面了,之前我们学习了基础数据类型,还有 scanf 函数和 printf 函数,这些知识都是单独的出现在我们之前的文章中的。今天呢,我将把它们组合在一起,给你展现一片新天地,你会掌握一种数据处理技巧,本质上是在上述几种数据类型之间做转换,从而使你对 scanf 函数和 printf 函数的理解更加深刻。
今天呢,我将给你介绍一种特殊的数组:字符数组,一种用来存储字符串信息的数组。来,跟我一起看看到底是怎么回事吧!
今日任务
首先,先让我们来看一下今天的任务。你还记得 printf 函数如何输出浮点型吧,那下面请你回忆一下,printf 函数在输出浮点型数据的时候,如何保留位数呢?下面的代码,演示了如何保留小数点后两位:
%lf 是 double 双精度浮点型输出的格式占位符,当我们想要保留小数点后两位的时候,只需要在 % 和 lf 中间加上 .2 即可,2 写在 .(点) 的后面代表小数点后 2 位。
有了上面这个基础,现在我让你保留小数点后 2 位、3 位、4 位。对你来说肯定都不是什么难题了。先不要高兴太早,今天我们的任务是,实现一个能够保留小数点后 n 位的程序,这里的 n 是我们程序读入的一个变量。
例如,面对如下输入:
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了 C 语言中 printf 函数的高级用法,重点讲解了如何在输出浮点型数据时保留特定位数的小数,并通过示例代码展示了实现的方法。文章还提出了一个任务,要求读入一个浮点数和一个整数,然后根据整数的值保留相应位数的小数并输出。作者指出了一个设计不太优美的程序示例,并提出了通过学习来尝试解决这个问题。此外,文章还介绍了字符串和字符数组的概念,以及字符串操作函数 sscanf 和 sprintf 的用法。通过阅读本文,读者可以掌握 C 语言中字符串操作的灵活应用,提高程序设计的技能和效率。文章内容丰富,涵盖了 C 语言中的字符串操作和字符数组的使用,为读者提供了丰富的技术知识和实用技巧。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《人人都能学会的编程入门课》,新⼈⾸单¥59
《人人都能学会的编程入门课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(26)
- 最新
- 精选
- 1900其实还可以这样理解: scanf做的是从控制台console取数据,存入相应的变量中,sscanf就是从字符串(C语言没有字符串类型,故这里的字符串其实就是字符数组)中取数据,存入相应的变量中; 同理,printf做的是将变量中的数据输出到控制台console,sprintf就是将变量中的数据输出到字符串中。 综上,只需要将scanf和printf中提到的控制台换成字符串,然后对应sscanf和sprintf,这样就好理解了。
作者回复: 对的!
2020-01-2812 - 学写代码的猪sscanf 和 sprintf 函数,本质上在做的是以字符串为中间值,做各种数据类型之间的转换。自学c语言的时候,还真没怎么重视。
作者回复: d(^_^o)
2020-01-163 - Makihao老师,你好 我是还不知道学习什么语言的时候看到你这篇文章,我是小白,有些部分感觉看的还不是太懂,比如课程里的“一起动手,搞事情”这一栏,能否在每次更新的一栏分享上一期你的思路代码,不然没有参考 感觉不懂越来越多 感谢老师
作者回复: 后面的文章会集中答疑,别着急,动手搞事情不会做的话,就往后看看。以及先学习一些其他知识,记住,采用螺旋式上升的学习方法。
2020-01-1722 - Jinlee思考题(1)实现了,了解到原来sprintf返回的就是字符串的长度,思考题(2)没有想到,老师能指点一下迷津吗?
作者回复: 今晚会发布题解,可以关注一下。
2020-01-1722 - 罗耀龙@坐忘茶艺师学编程 作业又是卡了好几天。在这里说说我踩的坑(主要都是在思考题二)。 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-161 - 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-171 - 一日思考题目:sprintf的返回值为字符串占用空间的长度,减去1就是strlen(仅限英文字符)。 遍历的话,就用while循环,判断获取到的某个字符是否有字符,没有就退出循环
作者回复: 第一个,有个问题,仔细想想,sprintf返回值到底是什么?是字符串占用的空间么? 第二个也有个问题,如何判断还有字符?
2020-01-1721 - 徐洲更今天的作业(不包括思考题): 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-1621 - 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
收起评论